2015-05-01 109 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