PowerShell命令在文件名中间插入1个字符

时间:2014-07-24 06:00:36

标签: powershell rename-item-cmdlet

有一个名为IMG_xxxx.JPG的图像目录,其中x是一个整数。我需要在下划线后插入一个“1”,因此每个名称都变为IMG_1xxxx.JPG。

我在PowerShell中试过这个:

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

并且它在我的目录中的许多文件上工作,然而,它在其他一些文件上发疯了,并试图在一些文件名中添加一个看似无限的1s循环。错误消息是:

  

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

很高兴在这里采取替代方法。了解我实际上做错了什么是完成重命名的第二个目标!感谢。

1 个答案:

答案 0 :(得分: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 { ... }