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

如何在通过管道传递给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:20:27