如何在通过管道传递给ForEach-Object时使用参数展开?
PowerShell管道中使用参数展开的问题
问题重现
以下代码在foreach循环中使用参数展开调用Get-ChildItem可正常运行:
$arr = @( @{ Path = "C:\Folder1" Recurse = $true }, @{ Path = "C:\Folder2" Recurse = $true } ) foreach ($obj in $arr) { Get-ChildItem @obj }
但尝试通过ForEach-Object管道结合参数展开时,无论写成Get-ChildItem @$_还是Get-ChildItem @($_)都无法运行:
$arr | ForEach-Object { Get-ChildItem @$_ }
报错信息
Get-ChildItem : Cannot find path 'C:\System.Collections.Hashtable' because it does not exist.
原因分析
在ForEach-Object的脚本块中,直接使用@$_会被PowerShell解析为数组展开而非哈希表的参数展开。由于$_是哈希表对象,数组展开会将整个哈希表作为单个值传递给Get-ChildItem的第一个位置参数(Path),哈希表转字符串后得到System.Collections.Hashtable,最终导致路径查找错误。
解决方案
可通过以下两种方式正确实现管道中的参数展开:
方法1:使用$PSItem代替$_
$PSItem是$_的正式别名,PowerShell能正确识别对它的哈希表参数展开:
$arr | ForEach-Object { Get-ChildItem @$PSItem }
方法2:借助临时变量中转
先将$_赋值给临时变量,再对临时变量执行参数展开:
$arr | ForEach-Object { $splatParams = $_; Get-ChildItem @splatParams }
内容的提问来源于stack exchange,提问作者LightningWar
相关产品推荐
相关产品推荐

