【问题标题】:Nested pipeline variable in powershellpowershell中的嵌套管道变量
【发布时间】:2020-07-24 12:47:11
【问题描述】:

我有以下目录树,它由一个包含 10 个子目录的根目录和每个子目录中的 1 个文件组成。

根/

  • 目录1/
    • 文件
  • 目录2/
    • 文件
  • ...
  • dir10/
    • 文件

我想以递归方式编辑文件的内容,将字符串“str1”替换为“str2”。我在powershell中发出了以下命令:

Get-ChildItem -Directory | foreach {(get-content $_/file) -replace "str1", "str2" | set-content $_/file}

它就像一个魅力,但我仍然不明白如何。我在 foreach 循环中使用了管道,但以下对 $_ 的调用仍然指的是 foreach 循环之外的管道。为什么会这样?

【问题讨论】:

    标签: powershell foreach nested pipeline


    【解决方案1】:

    我不认为你的命令有效,是问题所在。

    Get-ChildItem-Directory 开关使它只返回目录,而不是文件。如果要返回文件,请使用-File 开关。

    接下来,如果您有来自 Get-ChildItem 的项目列表,则这些项目会为您提供 System.IO.FileSystemInfo 对象。我们可以将这些直接提供给Get-Content 命令以将文件读入字符串。

    您可以从字符串调用任何the general operators PowerShell 产品,包括字符串替换运算符-Replace。其输出可以通过管道传输到Set-Content,并用于更新或附加内容到现有文件。

    Get-ChildItem | foreach {
        (get-content $_) -replace "str1", "str2" | Set-Content $_.FullName
    }
    
    

    注意这里唯一真正的变化是我从Get-ChildItem中删除了-Directory,然后修复了$PSItem上的语法(forEach循环中的当前变量的正式名称,通常写为@ 987654335@)。

    您可以使用我展示的语法的原因是forEach-object 为您提供了特殊的$_$PSitem 变量,用于在集合中引用$this

    【讨论】:

    • 感谢 FoxDeploy。该命令确实有效,我检查了。我使用了 -Directory 开关,因为我在每个子目录下都有几个文件,但我只想编辑一个。不过,我不知道特殊的 $_/$PSitem,也不知道 -PassThru 开关。我会再深入一点,谢谢!
    • 抱歉,Set-Content 不需要 -PassThru 开关,它只是在控制台中显示更改供您验证。
    【解决方案2】:

    特殊变量 $_ 对于 foreach 循环不是唯一的。 它是正在通过管道的对象的占位符。

    这篇文章:POWERSHELL POWER LESSON: THIS IS NO ORDINARY VARIABLE 详细介绍了 $_ 变量。

    【讨论】:

    • 我知道,这就是为什么我对我发出的命令起作用感到惊讶的原因:)
    【解决方案3】:

    $_| 都位于花括号 { } 或脚本块中的 foreach 循环内。

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多