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

Use double quote then curly brace in powershell -Command

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

任何人都可以阐明这一点吗?我不知道为什么它会无效。谢谢!

问题是将 -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==

您现在拥有了安全的命令提示符。