用途与问题
外层记录有名称,进入内层集合处理后再读取 $_.Name 却没有得到父记录名称,可能是当前对象已变成内层元素。应给需要跨层使用的值清楚命名,让每一层的数据来源可见,不依赖读者猜测自动变量的作用上下文。
原理与实现选择
$_ 与 $PSItem 表示当前管道对象,在内层管道中对应内层输入。下面先将父对象保存到 $parentRecord,再迭代它的值集合;生成的新对象同时保存父名称与当前值,不将外层身份与内层元素混为一项。
适用环境与验证范围
适用环境为 PowerShell 7。本页由 AI 辅助撰写与整理;完整受控样本已在本机 PowerShell 7.6 执行并通过检查。除文件元数据样本仅操作自行创建并清理的唯一临时文件外,其余样本只操作内存或局部会话;没有连接生产服务器或修改用户配置。已核对所引 PowerShell 与 .NET 官方资料,未在 Windows PowerShell 5.1 或目标生产环境执行,版本差异需另行验证。
可执行样本
在新的 PowerShell 7 测试会话中运行以下完整代码,保留所有检查语句。先阅读样本的文件与会话影响范围,不要在生产会话中直接替换真实输入;同名函数演示结束后退出该测试会话。
$parents = @([pscustomobject]@{Name='alpha'; Values=@(2,3)})
$result = @($parents | ForEach-Object {
$parentRecord = $_
$parentRecord.Values | ForEach-Object {
[pscustomobject]@{Parent=$parentRecord.Name; Value=$_}
}
})
if ($result.Count -ne 2) { throw 'Child count mismatch' }
if (($result.Parent -join ',') -ne 'alpha,alpha') { throw 'Parent context lost' }
if (($result.Value -join ',') -ne '2,3') { throw 'Child values lost' }
'Parent context saved before entering the inner pipeline'预期结果与核对
结果保留两条子记录以及各自父名称。示例为顺序管道,没有并行任务、远程调用或线程共享状态,不能据此假定捕获的外部变量适合并发访问。
常见误区
内层继续嵌套时应继续明确命名,避免复用同一个临时变量覆盖更外层上下文。诊断文字也不应混进成功输出流,否则下游收到的记录形状可能变化。
适用边界
适用于嵌套对象展开与关联转换。大规模数据处理还需控制展开数量和内存,不把局部变量命名方案当成性能优化或并发隔离。