You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CMD调用PowerShell时正确构建含空格路径的$Args数组

从CMD传递参数到PowerShell:正确处理带空格的参数

我通过CMD脚本运行PowerShell命令,受运行方式限制,必须从CMD传递的%*手动构建PowerShell的$Args变量。启动PS1代码前会通过CMD做文本替换,生成的初始处理代码如下:

$p='%*'; $Args=$p.Split(" ")

这种方式以空格为分隔符生成数组,但会错误拆分带空格的路径等内容——尽管CMD会自动为含空格的参数包裹双引号,单纯按空格拆分还是会破坏参数结构。我知道可以用PowerShell的-Split()结合正则替代.Split(),但不确定如何同时处理空格分隔规则与引号内的内容。

原方法示例代码

<# ::
@ECHO OFF
POWERSHELL -nop -ep bypass -c "POWERSHELL -nop -ep bypass -en ([System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((GC '%~f0' -raw) -Replace('###POWERSHELL BELOW THIS LINE###','$PSScriptRoot=''%~dp0'';$PSCommandPath=''%~f0'';Set-Location ''%~dp0''; $p=''%*''; $Args=$p.Split(""" """)))))"
GOTO :EOF
#>
###POWERSHELL BELOW THIS LINE###

"There are a total of $($args.count) arguments"
$Args | % { 'arg #{0}: [{1}]' -f ++$i, $_ }

cmd /c pause

更新后的可行解决方案

<# ::
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION & FOR %%a IN (%*) DO SET ARGS=!ARGS!%%a,
POWERSHELL -nop -ep bypass -c "POWERSHELL -nop -ep bypass -en ([System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((GC '%~f0' -raw) -Replace('###POWERSHELL BELOW THIS LINE###','$PSScriptRoot=''%~dp0'';$PSCommandPath=''%~f0'';Set-Location ''%~dp0''; $p=''!ARGS:~0,-1!''; $Args=$p.Split("""","""")))))"&ENDLOCAL
GOTO :EOF
#>
###POWERSHELL BELOW THIS LINE###

"There are a total of $($args.count) arguments"
$Args | % { 'arg #{0}: [{1}]' -f ++$i, $_ }

cmd /c pause

内容的提问来源于stack exchange,提问作者PlayLORD-SysOp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:33:10