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

-1

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

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, она работает.

Что случилось?

user1563721
источник
2
С какой стати вы должны смешивать пакет с PowerShell, а не просто использовать скрипт PowerShell напрямую? Для одного ваши цитаты выключены. У вас есть пара для set и один для -Command и они, вероятно, отменяют друг друга.
Seth
это работает вне цикла for, поэтому я предполагаю, что кавычки не проблема здесь
user1563721
Как вы запускаете команду вне цикла for? Как насчет размещения команды между одинарными кавычками и ввода пароля2 между двойными кавычками?
Lieven Keersmaekers

Ответы:

2

Проблема в том, что цикл 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
user1563721
источник
+1, не так, как я бы решил проблему, но вы правильно диагностировали источник сообщенной ошибки
dbenham