gpt4 book ai didi

powershell - PowerShell 批量文件重命名中的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 01:06:34 25 4
gpt4 key购买 nike

我是 PowerShell 的新手,最近我尝试重命名文件夹中的 120 个文件,但遇到了奇怪的行为。

我所拥有的是从 0001.txt、0002.txt、... 0120.txt 命名的文件,总共 120 个文件。我想在每个文件名前添加一个“a”。我想出了这个命令:

ls | ren -newname {$_.name -replace '(\d+)','a$1'}

但是执行后,我收到了很多这样的错误:

"The specified path, file name, or both are too long. The fully qualified file name must be less than 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

使用 -cf 开关进一步检查后,事实证明 PowerShell 会递归地尝试重命名过程。在重命名所有 120 个文件的第一遍之后,它再次将命令应用于 a0001.txt,有效地在文件名前面添加了另一个“a”。这一直持续到它达到路径长度限制并报告错误。

谁能告诉我我的重命名命令是否有问题?

最佳答案

管道到 Foreach-Object (简写 %{ } )批量重命名文件。如果你只是想在前面加上字母 对于每个文件名,您不需要正则表达式,您需要做的就是:

Get-ChildItem | %{Rename-Item $_ ('a' + $_.name)}

使用您喜欢的别名:
ls | %{ren $_ ('a' + $_.name)}

要使用正则表达式,使用 ($_.name -replace '^','a') 更简单.如果使用正则表达式的原因是目录中有其他文件,而您只想重命名以数字字符串和 命名的文件。 .txt 扩展名,请注意您使用的正则表达式会在前面加上 到任何连续数字串。例如, agent007.txt 将重命名为 agenta007.txt .你应该让正则表达式只匹配你想要的格式: '^(\d+)\.txt' .

另请注意,通过在 中使用正则表达式替换-新名称参数,您将每个与正则表达式不匹配的文件重命名为它已有的相同名称。对于 120 个文件来说没什么大不了的,但我会提前过滤文件列表:
Get-ChildItem | ?{$_ -match '^(\d+)\.txt'} | %{Rename-Item $_ ('a' + $_.name)}

更新: PowerShell 3.0 中似乎存在一个错误,该错误会导致批量文件重命名在某些情况下失败。如果文件通过管道目录列表重命名到 重命名项目 , 任何重命名为比其当前名称字母顺序更高的文件都将以其新名称重新处理,因为它稍后会在目录列表中遇到。这可能会导致重复重命名相同的文件,直到完整路径的长度超过 260 个字符的最大值并引发错误。

请注意,例如,如果字母 附加而不是前置,没有问题。这适用于任意数量的文件:
Get-ChildItem | %{Rename-Item $_ ($_.name + 'a')}

如果文件名为 b0001 , b0002 等,以及字母 前置,不会发生重复的重新处理。但是,如果信 c 是前置的,它确实会发生。

以下命令添加一个 如果所有文件的名称都以 开头,则到任意数量的文件的开头b :
Get-ChildItem | %{Rename-Item $_ ('a' + $_.name)}

给定相同的文件,名称以 开头b ,以下命令在字母 前面加上c 重复直到达到长度限制:
Get-ChildItem | %{Rename-Item $_ ('c' + $_.name)}

这只发生在包含一定数量或更多文件的列表中。 OP说他把文件数减少到20以下没有问题。我发现阈值是37(36个文件或更少,重新处理不会发生)。我尚未确定所有适用案例的数字是否相同,还是取决于更具体的因素。

稍后我将详细说明这一点,并在更具体地确定此问题的参数后向 Microsoft 提交错误报告。

解决方法: 过滤列表Get-ChildItem Where-Object 这样就排除了新文件名。更新部分之前的上述命令的最后一个版本适用于 PowerShell 3.0。据推测,重命名的文件以其新名称重新引入管道并再次处理,但因为新名称与过滤器 ?{$_ -match '^(\d+)\.txt'} 不匹配。 ,它们不会在第二次通过管道时重命名,也不会再次重新处理。

关于powershell - PowerShell 批量文件重命名中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com