L Z*_*L Z 5 powershell rename renaming
我是 PowerShell 的新手,最近我尝试重命名文件夹中的 120 个文件,但遇到了奇怪的行为。
我所拥有的是从 0001.txt、0002.txt、... 0120.txt 命名的文件,总共 120 个文件。我想在每个文件名前添加一个“a”。我想出了这个命令:
ls | ren -newname {$_.name -replace '(\d+)','a$1'}
Run Code Online (Sandbox Code Playgroud)
但是执行后,我收到了很多这样的错误:
“指定的路径、文件名或两者都太长。完全限定的文件名必须小于 260”
当我查看我的文件夹时,我得到的只是文件名
aaaaaaaaaaaaaaaaaaaaaaaaa(repeat until it hit system limit on path length)....a0001.txt
...
...
...
aaaaaaaaaaaaaaaaaaaaaaaaa(repeat until it hit system limit on path length)....a0120.txt
Run Code Online (Sandbox Code Playgroud)
使用 -cf 开关进一步检查后,事实证明 PowerShell 会递归地尝试重命名过程。在第一遍重命名所有 120 个文件后,它再次将命令应用于 a0001.txt,有效地在文件名前面添加了另一个“a”。这一直持续到它达到路径长度限制并报告错误。
谁能告诉我我的重命名命令是否有问题?
管道到Foreach-Object(简写%{ })以批量重命名文件。如果您只想在每个文件名前添加字母a,则不需要正则表达式,您需要做的就是:
Get-ChildItem | %{Rename-Item $_ ('a' + $_.name)}
Run Code Online (Sandbox Code Playgroud)
使用您喜欢的别名:
ls | %{ren $_ ('a' + $_.name)}
Run Code Online (Sandbox Code Playgroud)
要使用正则表达式,使用($_.name -replace '^','a'). 如果使用正则表达式的原因是您在目录中有其他文件,并且您只想重命名以数字字符串和.txt扩展名命名的文件,请注意您使用的正则表达式会在任何字符串前加上a的连续数字。例如,agent007.txt将重命名为agenta007.txt。您应该让正则表达式只匹配您想要的格式:'^(\d+)\.txt'.
另请注意,通过在-NewName参数中使用正则表达式替换,您将每个与正则表达式不匹配的文件重命名为其已有的相同名称。对于 120 个文件来说没什么大不了的,但我会提前过滤文件列表:
Get-ChildItem | ?{$_ -match '^(\d+)\.txt'} | %{Rename-Item $_ ('a' + $_.name)}
Run Code Online (Sandbox Code Playgroud)
更新: PowerShell 3.0 中似乎存在一个错误,在某些情况下可能会导致批量文件重命名失败。如果通过将目录列表通过管道传递给Rename-Item来重命名文件,则任何重命名为字母顺序高于其当前名称的文件的文件都将以其新名称重新处理,因为它在目录列表中稍后会遇到。这可能会导致重复重命名相同的文件,直到完整路径的长度超过 260 个字符的最大值并引发错误。
请注意,例如,如果将字母a附加而不是前置,则没有问题。这适用于任意数量的文件:
Get-ChildItem | %{Rename-Item $_ ($_.name + 'a')}
Run Code Online (Sandbox Code Playgroud)
如果文件名为b0001、b0002等,并且在前面加上字母a,则不会发生重复的重新处理。但是,如果前面有字母c,它确实会出现。
以下命令将单个一到任意数量的文件,如果他们的名字与开始的开始b:
Get-ChildItem | %{Rename-Item $_ ('a' + $_.name)}
Run Code Online (Sandbox Code Playgroud)
给定名称以b开头的相同文件,以下命令重复添加字母c直到达到长度限制:
Get-ChildItem | %{Rename-Item $_ ('c' + $_.name)}
Run Code Online (Sandbox Code Playgroud)
这只发生在包含一定数量或更多文件的列表中。OP说他把文件数减少到20以下没有问题。我发现阈值是37(36个文件或更少,重新处理不会发生)。我尚未确定所有适用案例的数字是否相同,还是取决于更具体的因素。
稍后我将详细说明这一点,并在更具体地确定此问题的参数后向 Microsoft 提交错误报告。
变通方法:使用Where-Object过滤Get-ChildItem 中的列表,以便排除新文件名。更新部分之前的上述命令的最后一个版本适用于 PowerShell 3.0。据推测,重命名的文件以其新名称重新引入管道并再次处理,但由于新名称与 filter 不匹配,因此它们不会在第二次通过管道时重命名,也不会再次重新处理。?{$_ -match '^(\d+)\.txt'}
| 归档时间: |
|
| 查看次数: |
1818 次 |
| 最近记录: |