2015-05-01 69 views
2

在这里有几个与此相关的问题,但它们专门针对写主机。我要像使用双引号,然后在powershell中使用大括号-Command

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

为什么在/ f之后有一个双引号?您已将字符串'“'example.exe'/ f”'分隔,但{GUID}不是由引号分隔的。 –

+0

@TonyHinkle我相信example.exe会引用双引号。删除它们导致powershell错误C:\ Users \ User \ AppData \ Local \ Temp \ {XXXXXXXX-XXXX-XXXX-XXXX- XXXXXXXXXXXX} \ Target.exe/s'不被识别为cmdlet的名称,功能,脚本文件或可操作的程序。 – sirdank

回答

0

问题是使用-Co​​mmand参数来处理除简单脚本之外的任何其他任何参数,您将遇到问题,例如花括号和引号等字符在被传递到Powershell之前将被命令提示符误导。你可以通过添加几层逃逸来打结,或者有一个简单的方法 - 使用-EncodedCommand参数。

对于你只需要为Base64的EncodedCommand编码您的命令,你可以用下面的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== 

你现在有一些命令提示符是安全的。

+0

非常感谢!我已经看到了-EncodedParameter命令,但不确定它的用法。很好的解释。 – sirdank