在批处理文件中屏蔽 PowerShell Get-ItemPropertyValue 单行

Posted

技术标签:

【中文标题】在批处理文件中屏蔽 PowerShell Get-ItemPropertyValue 单行【英文标题】:mask PowerShell Get-ItemPropertyValue one-liner in batch file 【发布时间】:2021-09-24 13:25:59 【问题描述】:

我在几个批处理脚本中使用 PowerShell 单行,但似乎未能正确转义以下一个:

如果未定义语言 ( for /f "usebackq" %%v in (`PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "(Get-ItemPropertyValue -Path 'HKCU:Control Panel\International\' -Name 'LocaleName').Split('-' )[0]"`) 设置 LANGUAGE=%%v )

我验证了在我的批处理文件中失败的正是这一行。代码背后的想法是从注册表中读取值并将连字符之前的第一部分分配给环境变量。因此,如果注册表值为“de-DE”,则 LANGUAGE 的值应为“de”。

【问题讨论】:

【参考方案1】:

我无法重现您提供的代码的问题。

不过,我建议您考虑其他方法 - 比较这些示例并注意哪个执行速度最快

@Echo off

 Setlocal

 For /f "delims=" %%v in ('where /r "%Windir%\SysWOW64\WindowsPowerShell" powershell.exe')Do Set "powershell=%%v -nologo -noprofile"

 Echo(%TIME%
 For /f "usebackq" %%v in (`PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "(Get-ItemPropertyValue -Path 'HKCU:Control Panel\International\' -Name 'LocaleName').Split('-')[0]"`) do set "LANGUAGE=%%v"
 Set LANG
 Echo(%TIME%

 For /f "usebackq tokens=1 Delims=-" %%G in (`
  %powershell% -c "Get-ItemPropertyValue -Path 'HKCU:Control Panel\International\' -Name 'LocaleName'"
 `)Do Set "LANGUAGE=%%G"
 Set LANG
 Echo(%TIME%

 For /f "Skip=1 tokens=3 Delims=- " %%G in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v localename')Do Set "LANGUAGE=%%G"
 Set LANG
 Echo(%TIME%

 Endlocal
Goto:Eof

【讨论】:

以上是关于在批处理文件中屏蔽 PowerShell Get-ItemPropertyValue 单行的主要内容,如果未能解决你的问题,请参考以下文章

使用 PowerShell 2.0 在远程计算机上运行批处理文件

喜欢在变量中获取 powershell 脚本的输出以在批处理文件中使用

如何在 PowerShell 中将文件作为流逐行处理

将 powershell 输出存储在 CMD 中的变量中

运行远程批处理文件时,Powershell 进程“挂起”

尝试从批处理文件运行 PowerShell 命令时出现错误