PowerShell中$args处理含空格参数被拆分,如何确保参数为字符串数组?
我编写了一个用于合并文件的PowerShell脚本,使用$args和for循环处理参数时运行正常。希望添加判断逻辑:当仅传入一个文件时不执行合并操作,但执行./myScript.ps1 "Single file name.ext"时,$args数组会将"Single"、"file"和"name.ext"作为独立元素,导致判断失效。
尝试用params([string[]] $files)定义参数,但执行./myScript.ps1 -files "11 12","13"时数组仅包含11这一个元素。另外脚本需配合Far Manager的!&命令使用,该命令会将选中文件转换为空格分隔、双引号包裹的字符串。
示例代码:
if ($args.Length -lt 2) { Write-Host "Not enough arguments" Exit 1 } for ($i=0; $i -lt $args.Length; $i++) { Write-Host "$($args[$i])" }
运行结果:
> powershell ./myScript.ps1 Not enough arguments > powershell ./myScript.ps1 "File1" "File2" "File3" File1 File2 File3 > powershell ./myScript.ps1 "File1" Not enough arguments > powershell ./myScript.ps1 "File 1" File 1 > powershell ./myScript.ps1 "File1" "File 2" "File 3" File1 File 2 File 3 > powershell ./myScript.ps1 'File 1' 'File 2' 'File 3' File 1 File 2 File 3
解决方案
1. 修正PowerShell调用方式
核心问题出在调用脚本时缺少-File参数:当直接用powershell ./myScript.ps1 "File 1"时,外层Shell会先解析双引号,传递给PowerShell的是无引号的File 1,PowerShell会按空格拆分参数。
正确调用方式:
# 直接在PowerShell环境中调用 ./myScript.ps1 "File 1" # 或通过外部Shell调用时加上-File参数 powershell -File ./myScript.ps1 "File 1"
添加-File后,PowerShell会原样接收带空格的参数,不会拆分。
2. 适配Far Manager的!&命令
Far Manager的!&命令会生成带双引号的空格分隔文件名,要让PowerShell正确识别,需在Far中执行:
!& powershell -File .\myScript.ps1
这样Far生成的带引号文件名会被PowerShell完整识别为单个参数,不会被拆分。
3. 规范脚本参数定义(可选)
如果想避免依赖$args,可以用更规范的参数定义:
param( [Parameter(Mandatory=$true, ValueFromRemainingArguments=$true)] [string[]]$Files ) if ($Files.Count -lt 2) { Write-Host "Not enough arguments" Exit 1 } foreach ($file in $Files) { Write-Host $file }
ValueFromRemainingArguments=$true会将所有未命名参数收集到$Files数组中,配合-File调用时,带空格的文件名能被正确识别。
验证结果
用正确方式调用后,运行结果符合预期:
> powershell -File ./myScript.ps1 "File 1" Not enough arguments > powershell -File ./myScript.ps1 "File 1" "File 2" File 1 File 2
内容的提问来源于stack exchange,提问作者unwado

