2017-08-31 20 views
3

我正在編寫一個腳本,該腳本使用給定的命令行參數遠程啓動程序。出於某種原因,我的一個字符串中的逗號(格式爲--Tags Small,Medium,Large)會在Invoke-Command和應用程序讀取參數之間的某個時間內對空格進行更改。Invoke-Command看起來將我的逗號轉換爲空格

PowerShell的:

param(
[string]$N = "remoteHost", 
[string]$U = "user", 
[string]$P = "pass", 
[string]$App = "App.exe", 
[string]$Arg = "--Tags Small,Medium,Large" 
) 
Write-Host "Connecting to" $N "..." 
$sec = ConvertTo-secureString $P -asPlainText -Force 
$session=New-PSSession -ComputerName $N -Credential (New-Object System.Management.Automation.PSCredential ($U,$sec)) 
$cmd = $App + " " + $Arg 
Write-Host $cmd 
$sb = ([scriptblock]::Create($cmd)) 
Write-Host $cmd 
Invoke-Command -Session $session -ScriptBlock $sb 
Write-Host "Disconnecting..." 
Remove-PSSession -Session $session 

兩個$ CMD和$ SB寫主機的顯示我的期望:

"App.exe --Tags Small,Medium,Large" 

但在 「APP.EXE」 應用程序,它接收ARGS:

"--Tags Small Medium Large" 

如果我通過命令行使用完全相同的字符串運行App.exe,它會看到逗號,因爲我認爲c顛覆正在發生在PowerShell中。

在應用程序和最後一個寫主機之間唯一的事情就是Invoke-Command,所以我在想它以某種方式將逗號轉換爲空格。我的問題是:

  1. 爲什麼要轉換逗號?
  2. 解決這個問題的最佳方法是什麼?

回答

2

:你將一個命令字符串

"App.exe --Tags Small,Medium,Large" 

到腳本塊。結果是一樣的,如果你想創建的腳本塊這樣的:

$sb = {App.exe --Tags Small,Medium,Large} 

當調用腳本塊解析器解釋Small,Medium,Large作爲一個字符串數組。但是,因爲你正在運行一個外部命令,你的命令行會被轉換爲一個字符串的某個字符串(因爲在這一天結束的時候這就是CreateProcess的期望)。重整字符串數組轉換爲字符串串接與output field separator$OFS,缺省是空格)數組元素,所以數組變爲Small Medium Large和你的命令行最終被

App.exe --Tags Small Medium Large 

爲了避免這種情況加上引號的說法,所以它是作爲一個逗號分隔的字符串傳遞:當我打電話寫主機$ SB

[string]$Arg = "--Tags 'Small,Medium,Large'" 
+0

所以,我看到的是不是實際上有逗號,那只是形式如何PowerShell的scriptblocks?令人沮喪的巧合。我測試了這個修復程序,它運行了 –

+0

逗號在那裏。但是當你調用scriptblock並且命令被實際解析時它們會被移除。如果您只需在PowerShell控制檯中輸入「App.exe - 標記小,中,大」,您應該會看到相同的行爲。 –

0

powershell解析器正在將「Small,Medium,Large」解釋爲一個數組,並將它們展開爲3個單獨的參數。你將不得不做一些報價說服PowerShell將它們解釋爲一個字符串,並把它們作爲一個單獨的參數:

$Arg = "--Tags '""Small,Medium,Large""'" 
相關問題