Comando do Windows batch powershell dentro do loop FOR não funciona

-1

Eu tenho o seguinte para loop dentro do arquivo em lotes:

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

)

E sempre recebo o seguinte erro: [System.Runtime.InteropServices.Marshal] :: PtrToStringAuto ($ BSTR) "" era inesperado no momento.

Quando executo o comando fora do loop for, ele funciona.

O que está errado?

user1563721
fonte
2
Por que diabos você misturaria um lote com um PowerShell e não apenas usaria um script do PowerShell diretamente? Por um lado, suas cotações estão desativadas. Você tem um par para sete um para o -Commande eles provavelmente estão se cancelando.
Seth
ele funciona fora do loop for para eu assumir que as aspas não são o problema aqui
user1563721
Como você executa o comando fora do loop for? Que tal colocar o comando entre aspas simples e Enter Password2 entre aspas duplas?
Lieven Keersmaekers

Respostas:

2

O problema é que o loop for pensa que o suporte final está dentro do comando powershell.

A solução possível é criar uma função e chamá-la do loop:

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
fonte
+1, Não como eu resolveria o problema, mas você diagnosticou corretamente a origem do erro relatado.
dbenham