2

有一个名为 IMG_xxxx.JPG 的图像目录,其中 x 是一个整数。我需要在下划线后插入一个“1”,这样每个名字就变成了IMG_1xxxx.JPG。

我在 PowerShell 中试过这个:

Dir | Rename-Item -NewName { $_.name -replace "_","_1" }

它适用于我目录中的许多文件,但是,它对其他一些文件很疯狂,并试图在某些文件名中添加一个看似无限的 1 循环。错误信息是:

Rename-Item : 指定的路径、文件名或两者都太长。完全限定的文件名必须少于 260 个字符,目录名必须少于 248 个字符。在 line:1 char:7 + Dir | 重命名项目 -NewName { $ .name -replace " ","_1" } + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\Users\michel...11111111109.JPG:String) [Rename-Item], PathTooLongExcepti on + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

很高兴这里有另一种方法。了解我实际上做错了什么是完成此重命名的次要目标!谢谢。

4

2 回答 2

1

我想问题是管道在Get-ChildItem仍在枚举文件时运行。您可能应该首先枚举所有文件,然后重命名它们,这样重命名的文件就不会被拾取两次:

(dir) | rename-Item -new { $_.name -replace '_','_1' }

括号确保dir首先完全评估它,然后其结果通过管道的其余部分。它在概念上与

$files = dir
$files | rename-item ...

另一种选择是检查您是否需要重命名文件:

dir | where { $_.Name -match '_\d{4}\D' } | rename-item -NewName { ... }
于 2014-07-24T06:04:57.337 回答
1
ls | Rename-Item -NewName {$_.name.Substring(0,WHERE_TO_INSERT) + "STRING_TO_BE_INSERTED"  + $_.name.Substring(WHERE_TO_INSERT)}

您可以使用它在文件名中插入任何您想要的字符串。适用于整个文件夹。

于 2022-01-19T09:40:11.837 回答