这里有几个与此相关的问题,但它们专门针对Write-Host。我想运行类似
的东西powershell.exe -Command "'example.exe' /f`"`{GUID`}`""
只有它失败并显示错误
Missing closing '}' in statement block.
At line:1 char:396
+ $mypid=(get-process EXEName*).id;wait-process -id $mypid;
& `C:\Users\User\AppData\Local\Temp\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\Target.exe`
/s /ig``{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX`}` /instance=1 /f3`C:\Recordings`
/f4`uninstall-log.txt` /f1`C:\Users\User\AppData\Local\Temp\`{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX`}\setup.iss`
/f2`C:\Users\User\AppData\Local\Temp\`{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX`}\setup.log` /removeonly <<<<
+ CategoryInfo : ParserError: (CloseBraceToken:TokenId) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace
我有其他字符串以"
开头,并且包含{}
(如/f"C:\Folder\{GUID}\program.exe"
,这些不会造成任何麻烦。这只是我的论点,其中花括号与双精度相邻引用:
/ig`"`{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX`}`"
在错误消息中,可能会或者可能不会注意到所有双引号都消失了所以我的/ ig参数留下了两个反引号。我相信我的版本是2.0。这是我的实际(修改)命令:
powershell -Command "$mypid=(get-process EXEName*).id;wait-process -id
$mypid;& 'C:\Users\User\AppData\Local\Temp\{XXXXXXXX-XXXX-XXXX-XXXX-
XXXXXXXXXXXX}\Target.exe' /s /ig`"`{XXXXXXXX-XXXX-XXXX-XXXX-
XXXXXXXXXXXX`}`" /instance=1 /f3`"C:\Recordings`" /f4`"uninstall-log.txt`"
/f1`"C:\Users\User\AppData\Local\Temp\`{XXXXXXXX-XXXX-XXXX-XXXX-
XXXXXXXXXXXX`}\setup.iss`"
/f2`"C:\Users\User\AppData\Local\Temp\`{XXXXXXXX-XXXX-XXXX-XXXX-
XXXXXXXXXXXX`}\setup.log`" /removeonly"
有人可以对此有所了解吗?我不知道为什么它会无效。谢谢!
答案 0 :(得分:0)
问题是将-Command参数用于除了简单脚本之外的任何其他问题,在这些问题中,大括号和引号等字符在传递给Powershell之前会被命令提示符错误地处理。您可以通过添加几层转义或者更简单的方式将自己绑在一起 - 使用-EncodedCommand参数来代替。
对于EncodedCommand,您只需对Base64编码您可以使用以下Powershell脚本执行的命令:
$command = @'
# Enter your commands containg curly braces and quotes here
# As long as you like
'@
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes) | clip.exe
这会将编码的命令复制到剪贴板,然后您需要做的就是键入:
powershell.exe -EncodedCommand
..然后粘贴您的命令,以便最终得到如下内容:
powershell.exe -EncodedCommand IAAgACMAIABFAG4AdABlAHIAIAB5AG8AdQByACAAcwBjAHIAaQBwAHQAIABjAG8AbgB0AGEAaQBuAGcAIABjAHUAcgBsAHkAIABiAHIAYQBjAGUAcwAgAGEAbgBkACAAcQB1AG8AdABlAHMACgAgACAAIwAgAEEAcwAgAGwAbwBuAGcAIABhAHMAIAB5AG8AdQAgAGwAaQBrAGUAIAAgAA==
现在你有一些命令提示安全的东西。