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

How to apply a rename command to all subfolders in powershell?

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

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

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

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

而这个 运行 但是没有对任何文件做任何事情。我也尝试了一些变体,但它们没有编译。

如有任何帮助,我们将不胜感激

通过管道输出的循环就是您所追求的。

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

这将为管道输出中的每个 行应用Rename-Item

dir -recurse ls

dirls[1] 都是 PowerShell Get-ChildItem cmdlet 的 别名 , 所以你需要:

  • 任一 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' }

为了概念清晰,我使用 '...' 引号而不是 "..." 引号,因为要使用字符串的内容 verbatim(不需要字符串插值)。此外,省略 -replace 运算符的 replacement-string 操作数 defaults'' (空字符串),因此可以省略。

注意:-replace 运算符默认情况下 不区分大小写 ,PowerShell 通常也是如此。如果只想在 all-uppercase 中匹配 ALL,请使用 sensitive 运算符变体
-creplace.


至于你试过的

this ran, but didn't do anything to any of the files

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

  • 由于 -Path-Recurse 相结合的非常不幸的行为,在 GitHub issue #5699 中有所描述,没有发生错误,尽管(大概)没有文件或子目录字面上命名为ls.

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

    • 虽然在您的情况下这种行为相当于 模糊的失败,但在 worst-case 情况下它可能是 破坏性的,如链接 GitHub 问题中所述。


[1] 在 Windows 上;在 Unix-like 平台上,ls 指的是 platform-native /bin/ls 实用程序。

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