маска PowerShell Get-ItemPropertyValue однострочная в пакетном файле

#powershell #batch-file #one-liner

Вопрос:

Я использую однострочные строки PowerShell в нескольких пакетных сценариях, но, похоже, не удается правильно избежать следующего:

если ЯЗЫК не определен (
для /f "usebackq" %%v в (`PowerShell.exe -NoProfile -Обход политики выполнения-Команда "(Get-ItemPropertyValue -Путь "HKCU:Панель управленияМеждународный" -Имя "Локальное имя").Раскол('-')[0]"`) установите ЯЗЫК=%%v
)

Я проверил, что именно эта строка не работает в моем пакетном файле. Идея кода состоит в том, чтобы прочитать значение из реестра и назначить первую часть перед дефисом переменной среды. Поэтому, если значение реестра «de-DE», ЯЗЫК должен иметь значение «de».

Ответ №1:

Я не могу воспроизвести проблему с предоставленным вами кодом.

Однако я бы посоветовал вам рассмотреть другие подходы — сравните эти примеры и отметьте, какой из них выполняется быстрее всего

 @Echo off

 Setlocal

 For /f "delims=" %%v in ('where /r "%Windir%SysWOW64WindowsPowerShell" 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 PanelInternational' -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 PanelInternational' -Name 'LocaleName'"
 `)Do Set "LANGUAGE=%%G"
 Set LANG
 Echo(%TIME%

 For /f "Skip=1 tokens=3 Delims=- " %%G in ('reg query "HKEY_CURRENT_USERControl PanelInternational" /v localename')Do Set "LANGUAGE=%%G"
 Set LANG
 Echo(%TIME%

 Endlocal
Goto:Eof