【问题标题】:Powershell argumentlist and double+ spacesPowershell 参数列表和双 + 空格
【发布时间】:2015-10-29 00:20:54
【问题描述】:

有人能解释一下吗?我正在运行以下 Powershell 命令,两个“测试”之间的双空格被转换为一个空格。使用 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'

但下面用单空格代替了双空格:

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

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

【问题讨论】:

    标签: string powershell arguments powershell-3.0


    【解决方案1】:

    据我所知,这是因为在发送到 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`""
    

    【讨论】:

    • 谢谢你,很好的解释。
    猜你喜欢
    • 2018-08-17
    • 2021-07-16
    • 1970-01-01
    • 2014-09-28
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2017-09-06
    相关资源
    最近更新 更多