我是Powershell的新手,我很难将这个命令应用于我拥有的所有子文件夹。我使用过:
ls | Rename-Item -NewName {$_.name -replace "ALL",""}
这仅适用于我所在的一个子文件夹。这会从文件名中删除 ALL,因为我的目的不需要这样做。我将如何将此命令应用于所有子文件夹,这样我就不必手动进入并一次应用一个子文件夹。到目前为止,我已经尝试过
dir -recurse ls | Rename-Item -NewName {$_.name -replace "ALL",""}
它运行了,但没有对任何文件执行任何操作。我也尝试了几种变体,但它们没有编译。
任何帮助将不胜感激
dir -recurse ls
dir
和ls
[1]都是 PowerShellGet-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' }
我使用'...'
引用而不是"..."
引用来明确概念,因为字符串的内容是逐字使用的(不需要字符串插值)。此外,省略-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自己的命名约定形成的,其中g
是Get
的官方别名缩写,是批准的动词之一。
通过管道输出的循环将是你所追求的。
Get-ChildItem -Recurse | ForEach-Object{Rename-Item -Path $_.FullName -NewName $($_.Name -replace "ALL","")}
这将对管道输出中的每一行应用Rename-Item
。