在powershell中使用双引号然后使用大括号-Command

时间:2015-05-01 15:07:51

标签: powershell escaping brackets

这里有几个与此相关的问题,但它们专门针对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" 

有人可以对此有所了解吗?我不知道为什么它会无效。谢谢!

1 个答案:

答案 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==

现在你有一些命令提示安全的东西。