Powershell参数列表和双+空格

时间:2015-08-06 02:22:16

标签: string powershell arguments powershell-v3.0

有人能解释一下吗?我正在运行以下Powershell命令,并且2个“test”之间的双空格被转换为单个空格。使用PS 3.0。

Start-Process Powershell -ArgumentList "-Command Write-Host test  test;pause"
Start-Process Powershell -ArgumentList "-Command Write-Host 'test  test';pause"
Start-Process Powershell -ArgumentList "Write-Host 'test  test';pause"

下面的脚本调用(只包含$ String参数和Write-Host $ String;暂停)工作正常,但在同一会话中执行:

& C:\Test\Test.ps1 -String 'test  test'

但是下面用单个替换双空格:

Start-Process Powershell -ArgumentList "& C:\Test\Test.ps1 -String 'test  test'"

我需要能够在当前会话之外运行另一个PS脚本,并将参数传递给可能包含双重空格的脚本。谢谢!

1 个答案:

答案 0 :(得分:3)

据我所知,这种情况正在发生,因为在发送到PowerShell之前,双引号没有放在参数周围。这将导致shell在PowerShell看到它们之前折叠空间(因为它解析参数)。

所以我尝试了这个测试:

Start-Process powershell.exe -ArgumentList "-NoExit -Command Write-Verbose '1 2  3   .' -Verbose"

它失败了,就像你的那样,没有空格。

所以在新推出的PowerShell窗口中,我运行了这个:

gwmi Win32_Process -Filter "ProcessId = '$([System.Diagnostics.Process]::GetCurrentProcess().Id)'" | select -ExpandProperty CommandLine

结果:

"C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit -Command Write-Verbose '1 2  3   .' -Verbose 

查看命令周围没有双引号? shell似乎并不关心单引号,因此命令中的每个空格都会让shell认为它是一个新参数(它基本上是在空格上分裂,所以多个连续的空格都会折叠,除非它看到一个双引号字符串,被视为单个参数。)

您可以通过自己嵌入引号来修复它。

Start-Process Powershell -ArgumentList "`"Write-Host 'test  test';pause`""