如何将重命名命令应用于 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
dir
和 ls
[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的自己的命名约定形成的,其中g
是Get
的官方别名缩写,approved verbs.
我是 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
dir
和 ls
[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
-
您的
ls
在位置上绑定到Get-ChildItem
的-Path
参数。由于
-Path
与-Recurse
相结合的非常不幸的行为,在 GitHub issue #5699 中有所描述,没有发生错误,尽管(大概)没有文件或子目录字面上命名为ls
.实际上,
Get-ChildItem
在子目录层次结构的所有级别 上查找名为ls
的文件或目录,并且在没有任何东西产生无输出,即相当于安静no-op.虽然在您的情况下这种行为相当于 模糊的失败,但在 worst-case 情况下它可能是 破坏性的,如链接 GitHub 问题中所述。
dir -recurse ls
命令中的 [1] 在 Windows 上;在 Unix-like 平台上,ls
指的是 platform-native /bin/ls
实用程序。
[2] 这是最佳选择,因为它不使用另一个 shell 或平台的相似但语法不同的命令或实用程序的名称。名称gci
是根据PowerShell的自己的命名约定形成的,其中g
是Get
的官方别名缩写,approved verbs.