如何为PowerShell的Start-Process传递含空格的CLI参数?
PowerShell传递带空格参数给外部进程的转义解决方案
你的问题核心是:通过-file调用脚本时,$args接收的参数会丢失原有的引号转义,导致传递给wsl.exe的参数格式不正确,进而无输出。以下是几种可行的解决方法:
方法1:直接调用外部命令(推荐)
放弃使用Start-Process,改用PowerShell的直接调用运算符&传递参数,这种方式能自动处理参数的转义和拆分,更可靠:
& wsl.exe @args
执行原调用命令时就能正常输出Hello World:
powershell -noprofile -executionpolicy bypass -file sh.ps1 bash -c "`"echo Hello World`""
方法2:修复Start-Process的参数处理
如果必须使用Start-Process,需要对$args中的参数做预处理,给带空格或特殊字符的参数重新添加引号并转义内部符号:
# 处理参数:为含空格/特殊字符的参数添加引号,转义内部双引号 $processedArgs = $args | ForEach-Object { if ($_ -match '\s|["''\\]') { "`"$($_ -replace '"', '\"')`"" } else { $_ } } $proc = Start-Process -FilePath "wsl.exe" -ArgumentList $processedArgs -NoNewWindow -PassThru $proc | Wait-Process
方法3:调整脚本调用方式
改用-Command参数调用脚本,能更精准地控制参数的传递格式,避免-file模式下的参数解析问题:
powershell -noprofile -executionpolicy bypass -Command "& '.\sh.ps1' bash -c '`"echo Hello World`"'"
内容的提问来源于stack exchange,提问作者jkroepke
相关产品推荐
相关产品推荐

