如何将重命名命令应用于Powershell中的所有子文件夹?



我是Powershell的新手,我很难将这个命令应用于我拥有的所有子文件夹。我使用过:

ls | Rename-Item -NewName {$_.name -replace "ALL",""}

这仅适用于我所在的一个子文件夹。这会从文件名中删除 ALL,因为我的目的不需要这样做。我将如何将此命令应用于所有子文件夹,这样我就不必手动进入并一次应用一个子文件夹。到目前为止,我已经尝试过

dir -recurse ls | Rename-Item -NewName {$_.name -replace "ALL",""}

运行了,但没有对任何文件执行任何操作。我也尝试了几种变体,但它们没有编译。

任何帮助将不胜感激

dir -recurse ls

dirls[1]都是 PowerShellGet-ChildItemcmdlet 的别名,因此需要:

  • 要么dir -recurse
  • ls -recurse
  • - 如果要使用别名[2]-gci -recurse,这是最佳选择
  • 或者,最后,使用完整的 cmdlet 名称,Get-ChildItem -Recurse

要查看为Get-ChildItem定义的所有别名,请运行Get-Alias -Definition Get-ChildItem

此外,若要限制对文件的处理,请添加-File开关:

Get-ChildItem -File -Recurse | Rename-Item -NewName { $_.Name -replace 'ALL' }

我使用'...'引用而不是"..."引用来明确概念,因为字符串的内容是逐字使用的(不需要字符串插值)。此外,省略-replace运算符的替换字符串操作数默认''(空字符串),因此可以省略它。

注意:默认情况下,-replace运算符不区分大小写,就像 PowerShell 通常一样。如果只想以全大写形式匹配ALL,请使用运算符
的区分大小写的变体-creplace


至于你尝试过的

运行了,但没有对任何文件执行任何操作

  • dir -recurse ls命令中的ls在位置上绑定到Get-ChildItem
    -Path参数。

  • 由于 GitHub 问题 #5699 中描述的-Path-Recurse结合使用的非常不幸的行为尽管(大概)没有字面上名为ls的文件或子目录,但没有发生错误。

    • 实际上,Get-ChildItem子目录层次结构的所有级别上查找名为ls的文件或目录,并且在没有任何输出的情况下,不产生任何输出,即相当于安静的无操作

    • 虽然在您的情况下,此行为相当于模糊的失败,但在最坏的情况下,它可能具有破坏性,如链接的 GitHub 问题中所述。


[1]在Windows上;在类Unix平台上,ls是指平台原生/bin/ls实用程序。

[2] 这是最好的选择,因为它不使用另一个 shell 或平台的类似但语法不同的命令或实用程序的名称。名称gci是根据PowerShell自己的命名约定形成的,其中gGet的官方别名缩写,是批准的动词之一。

通过管道输出的循环将是你所追求的。

Get-ChildItem -Recurse | ForEach-Object{Rename-Item -Path $_.FullName -NewName $($_.Name -replace "ALL","")}

这将对管道输出中的每一行应用Rename-Item

最新更新