PowerShell嵌套管道场景下$_管道变量的指向规则疑问
PowerShell嵌套管道
$_变量取值原理解析 核心规则
$_的取值由它所在的脚本块({ })作用域决定:只有被包裹在对应管道命令的脚本块内部时,$_才会代表当前管道迭代的对象;如果没有嵌套新的脚本块,上层作用域的$_取值不会被内层管道覆盖。
针对你提供的代码逻辑拆解
你给出的代码结构可拆分出两层管道,但只有外层管道生成了新的脚本块作用域:
- 外层
Get-ChildItem 'C:\*.txt' | ForEach-Object { ... }中,{ }是ForEach-Object的执行脚本块,在这个脚本块的完整作用域内,$_默认指向Get-ChildItem返回的当前文件对象,没有主动赋值的情况下取值不会变化。 - 脚本块内部的内层管道
(Get-Content $_) -replace $SourceString,$ReplacementString | Set-Content $_.fullname,不存在新的脚本块:- 替换后的字符串直接作为
Set-Content的待写入内容传入,没有搭配ForEach-Object/Where-Object这类需要额外脚本块处理的命令,因此不会生成新的作用域覆盖$_的取值。 Set-Content的路径参数$_.fullname是在外层ForEach-Object的脚本块下直接求值的,自然读取到的是外层当前文件对象的属性。
- 替换后的字符串直接作为
对比示例(内层管道覆盖$_的场景)
如果在内层管道后新增带脚本块的处理命令,脚本块内部的$_就会切换为内层管道的对象:
$SourceString = 'DAT' $ReplacementString = 'CAT' Get-ChildItem 'C:\*.txt' | ForEach-Object { # 此处$_ = 当前文本文件对象 (Get-Content $_) -replace $SourceString,$ReplacementString | ForEach-Object { # 此处$_ = 替换后的单行文内容,属于内层管道的迭代对象 $_ + "_custom_suffix" } | Set-Content $_.fullname # 回到外层脚本块作用域,$_恢复为当前文本文件对象 }
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

