在 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==
您现在拥有了安全的命令提示符。
此处有几个与此相关的问题,但它们专门针对 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==
您现在拥有了安全的命令提示符。