我正在编写一个脚本,该脚本使用给定的命令行参数远程启动程序。出于某种原因,我的一个字符串中的逗号(格式为--Tag Small,Medium,Large)在Invoke-Command和应用程序读取args之间的某个时间间隔对空格进行了更改。
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 Write-Host都显示了我的期望:
"App.exe --Tags Small,Medium,Large"
但是在“App.exe”应用程序中,它正在接收args:
"--Tags Small Medium Large"
如果我通过命令行使用完全相同的字符串运行App.exe,它会看到预期的逗号,所以我认为转换发生在powershell中。
应用程序和最后一个Write-Host之间的唯一内容是Invoke-Command,所以我想它会以某种方式将逗号转换为空格。我的问题是:
答案 0 :(得分:2)
转换命令字符串
"App.exe --Tags Small,Medium,Large"
到一个scriptblock。结果与您创建如下脚本块相同:
$sb = {App.exe --Tags Small,Medium,Large}
当您调用该scriptblock时,解析器会将Small,Medium,Large
解释为字符串数组。但是,因为你正在运行一个外部命令,所以你的命令行会在某个地方被转换为一个字符串(因为在那一天结束时是CreateProcess
所期望的)。将字符串数组绑定到字符串中将数组元素与output field separator($OFS
,默认为空格)连接起来,因此数组变为Small Medium Large
,命令行最终成为
App.exe --Tags Small Medium Large
要避免此行为,请将参数放在引号中,以便将其作为逗号分隔的字符串传递:
[string]$Arg = "--Tags 'Small,Medium,Large'"
答案 1 :(得分:0)
powershell解析器正在解释"小,中,大"作为一个数组并将它们扩展为3个单独的参数。您将不得不做一些引用来说服powershell将它们解释为单个字符串并将它们作为单个参数传递:
$Arg = "--Tags '""Small,Medium,Large""'"