如何在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
相关产品推荐
相关产品推荐

