【问题标题】:mask PowerShell Get-ItemPropertyValue one-liner in batch file在批处理文件中屏蔽 PowerShell Get-ItemPropertyValue 单行
【发布时间】: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”。
【问题讨论】:
标签:
powershell
batch-file
one-liner
【解决方案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