Пакетная команда PowerShell для Windows внутри цикла FOR не работает

Пакетная команда PowerShell для Windows внутри цикла FOR не работает

У меня есть следующий цикл for внутри пакетного файла:

for /l %%x in (1, 1, %k%) do (

    set "psCommand=powershell -Command "$pword = read-host 'Enter Password2' -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
    for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p

)

И я всегда получаю следующую ошибку: [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"" в этот раз было неожиданным.

Когда я запускаю команду вне цикла for, она работает.

Что не так?

решение1

Проблема в том, что цикл for считает, что закрывающая скобка находится внутри команды PowerShell.

Возможным решением является создание функции и ее вызов из цикла:

for /l %%x in (1, 1, %k%) do (
    call :getPassword password
)

:getPassword
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
EXIT /B 0

Связанный контент