FOR ループ内の Windows バッチ PowerShell コマンドが機能しない

FOR ループ内の Windows バッチ PowerShell コマンドが機能しない

バッチ ファイル内に次の 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

関連情報