使用-ArgumentList传递Start-Job参数异常问题求助
参数传递错位问题求助
我尝试解决这个问题好一阵了,始终没搞定。我原本要把$True传给Recurse开关参数,('a')传给SubDirs,但实际运行结果完全相反——Recurse变成了False,SubDirs被赋值成了True,下面是详细情况:
脚本块
$removeScriptBlock1 = { param ( [string]$ToDeleteFiles, [switch]$Recurse, [System.Object]$SubDirs) Write-Host "ToDeleteFiles: $ToDeleteFiles" Write-Host "Recurse: $Recurse" Write-Host "SubDirs: $SubDirs" if($SubDirs) { write-host "In sub dir" return } if($Recurse){ Write-Host "In Recurse" } else { Write-Host "Not Recurse" } }
运行命令
$j = Start-Job $removeScriptBlock1 -ArgumentList "C:\Test",$True,('a') Wait-Job $j Receive-Job -job $j
输出结果
Recurse和SubDirs参数值不符合预期
ToDeleteFiles: C:\Test Recurse: **False** SubDirs: **True** In sub dir
问题原因及解决办法
核心原因
PowerShell里的**[switch]类型开关参数**,不能直接通过位置参数传$True/$False。当你用-ArgumentList传递$True时,PowerShell不会把它识别为启用Recurse开关,反而会把这个布尔值直接传给下一个位置参数SubDirs,导致整个参数链错位。
两种解决方式
方式1:用命名参数哈希表传递(推荐)
通过哈希表明确指定每个参数的名称和对应值,彻底避免位置错位问题:
$j = Start-Job -ScriptBlock $removeScriptBlock1 -ArgumentList @{ ToDeleteFiles = "C:\Test" Recurse = $True SubDirs = 'a' }
方式2:强制转换开关参数类型
如果一定要用位置参数传递,需要把$True强制转换成[switch]类型,让PowerShell正确识别为开关参数的启用:
$j = Start-Job $removeScriptBlock1 -ArgumentList "C:\Test", [switch]$True, 'a'
验证效果
用上面任意一种方法修改后,运行结果会符合预期:
ToDeleteFiles: C:\Test Recurse: True SubDirs: a In Recurse
内容的提问来源于stack exchange,提问作者deetle
相关产品推荐
相关产品推荐

