powershell "Start-Process -FilePath 'c:\PSexec.exe' -ArgumentList "-s -i -d -u .\USERNAME -p PASSWORD \\192.168.1.1 cmd /C "O: && cd O:\SOMEDIR && perl run.pl --socket 192.168.0.1:7890 & pause"" -Wait -Passthru -WindowStyle Hidden"
启动远程psexec进程并使用powershell包装器等待进程完成。
这一切都有效,除非我添加了powershell包装器,我似乎无法弄清楚如何正确地转义内部双引号。
The string is missing the terminator: '. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString 'pause'`" -Wait -Passthru -WindowStyle Hidden"' is not recognized as an internal or external command, operable program or batch file.
我尝试过的事情:
我不想使用-EncodedString将其编码为base64,因为将调用该命令,其中某些部分可能被替换为1000次。此外,这是从perl脚本调用的,并且不希望每次运行perl脚本时都必须检查一个powershell文件。 (即我更愿意使用perl脚本中包含的powershell命令)
从How to escape powershell double quotes from a bat file?建议用四重引号替换双引号。但是,当我这样做时,我得到了
powershell "Start-Process -FilePath 'c:\PSexec.exe' -ArgumentList ""-s -i -d -u .\USERNAME -p PASSWORD \\192.168.1.1 cmd /C ""O: && cd O:\SOMEDIR && perl run.pl --socket 192.168.0.1:7890 & pause"""" -Wait -Passthru -WindowStyle Hidden"
At line:1 char:1 + Start-Process -FilePath 'c:\PSexec.exe' -ArgumentList -EncodedCommand ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Start-Process], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
答案 0 :(得分:2)
删除PowerShell调用,不需要它。从psexec调用中删除-d选项,它将等待它启动的任何进程完成。 Read the psexec docs。从我们的文档:
-d不要等待进程终止(非交互式)。