Powershell argumentlist 和 double+ 空格

Powershell argumentlist and double+ spaces

有人能解释一下吗?我正在 运行 执行以下 Powershell 命令,2 个 "test" 之间的双 space 被转换为单个 space。使用 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;pause)工作正常,但在同一会话中执行:

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

但是下面用单个 space 替换了双 space:

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

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

据我所知,发生这种情况是因为在将参数发送到 PowerShell 之前没有将双引号括起来。这将导致 shell 在 PowerShell 看到它们之前折叠 spaces(因为它解析参数)。

所以我尝试了这个测试:

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

它像你一样失败了,没有 spaces。

所以在新创建的 PowerShell window 中,我 运行 这个:

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 似乎并不关心单引号,因此您命令中的每个 space 都会使 shell 认为这是一个新参数(它基本上是在 space 上拆分,因此多个连续的 space 会被折叠,除非它看到双引号字符串,该字符串被视为单个参数)。

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

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