PowerShell中具有顺序数字后缀的文件的大容量重命名



我有14000张按年份和月份分类的照片,但是用多台相机拍摄的,我希望文件名能反映拍摄日期。例如,1998年10月16日的图片位于名为1998\10 October \19981016的文件夹中。

我希望所有的图片都命名为198116_0001 19981016_0002等。我尝试了多种建议,但都没有成功。

我可以看到它列出了我想更改的文件夹,但我无法真正更改它。我所有的图片都是.jpg。

尝试次数我创建了一个副本的临时文件,以防我把它搞砸了。我开始输入cd "C:Documents and SettingsBrooke LastNameDesktopTemp",然后在成功加载我的文件后,我使用了我在这个论坛上找到的公式。

ls *jpg | Foreach {$i=1} {Rename-Item _ -NewName ("$($.19981016){0:00000000#} .jpg" -f $i++) -whatif}

我得到的错误说

Unexpected token ' .19981016' in expression or statement.
At line:1 char:12 + $.19981016 <<<<

这个错误重复了好几次。

我在网上找到了几个公式,但大多数创建的文件都是用括号编号的,例如holiday(1).jpg。我希望在约会结束时在下划线后面有一个四位数的计数器,例如19981016_0001

语法太差了。几个问题:

  • 我不确定$($.19981016)的意图是什么,但$()计算括号中的表达式并将结果插入字符串中,您会得到错误,因为$.19981016不是有效的表达式。对于目录中的每个.jpg文件,都会重复出现该错误
  • 格式化字符串中的{0:00000000#}将创建一个9位数的零填充数,但较短的方法是{0:D9}。然而,我认为您希望零填充数字有4位,因此应该是{0:0000#}{0:D4}
  • 我不确定Foreach {$i=1} { [...]应该做什么。关键字foreach可以表示foreachloop,也可以是foreach Object的简写。在这种情况下,从管道接收输入必然是后者,但无论哪种方式,这种语法都是不正确的

如果我正确理解描述,这将做你想做的事:

$i = 1
Get-ChildItem *.jpg | %{Rename-Item $_ -NewName ('19981016_{0:D4}.jpg' -f $i++)}

文件名将为19981016_0001.jpg1998年10月16日_0002.jpg998年10月03日.jpg等。

几个注意事项:

  • 您说过您想要像19981016-00001这样的文件名,但我假设您希望保留.jpg扩展名
  • 您需要初始化$i,否则它将从0开始(如果尚未定义),或者更糟的是,如果$0以前在同一PowerShell会话中使用过,它将从其他数字开始。例如,如果目录中有1432.jpg文件,并且您首先使用-WhatIf运行命令,然后实际运行,则数字将从1432开始
  • $i++$i增加1。但是,如果您将其用作一个值,则在读取值之后,它会递增;这就是为什么如果$i未定义,它将从0开始
  • Get-ChildItemls相同。我使用了本机PowerShell名称,但它们是可互换的(lsdirgci都是Get-ChildItem的别名)
  • %{}Foreach对象的简写

这接近最初的问题。实际上,您可以将脚本块数组传递给foreach对象进程,如文档所述(几乎没有)。我是在布鲁斯·帕耶特的书之后才知道这一点的。包含的文件夹名称为"19981016"。源文件名可能没有按照您期望的顺序排列。

ls *jpg | 
Foreach {$i=1} {Rename-Item $_ -NewName ("$($_.directory.name)_{0:000#}.jpg" -f
  $i++) -whatif}

What if: Performing the operation "Rename File" on target "Item: C:usersjs19981016file1.jpg Destination: C:usersjs1998101619981016_0001.jpg".
What if: Performing the operation "Rename File" on target "Item: C:usersjs19981016file10.jpg Destination: C:usersjs1998101619981016_0002.jpg".
What if: Performing the operation "Rename File" on target "Item: C:usersjs19981016file2.jpg Destination: C:usersjs1998101619981016_0003.jpg".
$path="C:..."
$files=Get-ChildItem $path -Filter *.gif  
Foreach($obj in $files){
   $pathWithFilename=$path + $obj.Name;
   $newFilename= "file_"+$obj.Name; 
   Rename-Item -Path $pathWithFilename -NewName $name
}

您可以在powershell ISE中使用此代码块。输出示例如下:

旧文件:

1232.gifasd.gif

运行后代码:

文件_1232.giffile_asd.gif

最新更新