FOR循环中的Windows批量powershell命令不起作用


-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循环外运行命令时,它可以工作。

怎么了?


2
为什么你要将批处理与PowerShell混合而不仅仅是直接使用PowerShell脚本?一个你的报价是关闭的。你有一对set和一对-Command,他们可能互相取消。
Seth

它在for循环之外工作所以我假设引号不是这里的问题
user1563721 2016年

如何在for循环外运行命令?如何在双引号之间将命令放在单引号和Enter Password2之间?
Lieven Keersmaekers

Answers:


2

问题是for循环认为end括号在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

+1,不是我如何解决问题,但你已经正确诊断出报告错误的来源。
dbenham 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.