使用顺序数字后缀批量重命名PowerShell中的文件
我有14000张照片按年份和月份分类成文件,但使用多个摄像头拍摄,我希望文件名反映拍摄日期。例如,1998年10月16日图片位于名为1998\10月10日\19981016的文件夹中 我希望所有图片都命名为19981016\u 0001 19981016\u 0002等。我尝试了多种建议,但都没有成功 我可以看到它列出了我想更改的文件夹,但实际上我无法更改它。我所有的照片都是.jpg 尝试 我创建了一个临时副本文件,以防搞砸。我首先键入使用顺序数字后缀批量重命名PowerShell中的文件,powershell,Powershell,我有14000张照片按年份和月份分类成文件,但使用多个摄像头拍摄,我希望文件名反映拍摄日期。例如,1998年10月16日图片位于名为1998\10月10日\19981016的文件夹中 我希望所有图片都命名为19981016\u 0001 19981016\u 0002等。我尝试了多种建议,但都没有成功 我可以看到它列出了我想更改的文件夹,但实际上我无法更改它。我所有的照片都是.jpg 尝试 我创建了一个临时副本文件,以防搞砸。我首先键入cd“C:\Documents and Settings\B
cd“C:\Documents and Settings\Brooke LastName\Desktop\Temp”
,然后在成功加载文件后,我使用了在这个论坛上找到的公式
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 <<<<
表达式或语句中的“意外标记”.19981016”。
在第1行char:12+$.19981016中,语法有点偏离。几个问题:
- 我不确定
$($.19981016)
打算产生什么,但是$()计算括号中的表达式并将结果插入字符串,您会得到错误,因为$.19981016
不是有效的表达式。对于目录中的每个.jpg文件,都会重复此错误
- 格式化字符串中的
{0:00000000}
将创建一个由9位数字组成的零填充数字,但较短的方法是{0:D9}
。但是,我认为您希望零填充数字有4位数字,因此应该是{0:0000}
或{0:D4}
- 我不确定
Foreach{$I=1}{[…]
应该做什么。关键字Foreach可以表示Foreach循环,也可以是Foreach对象的简写。在这种情况下,从管道接收输入,必然是后者,但这种语法无论如何都是不正确的
如果我正确理解描述,这将满足您的要求:
$i = 1
Get-ChildItem *.jpg | %{Rename-Item $_ -NewName ('19981016_{0:D4}.jpg' -f $i++)}
文件名将是19981016_0001.jpg,19981016_0002.jpg,19981016_0003.jpg,等等
请注意:
- 您说过您想要像19981016\u 0001这样的文件名,但我假设您想要保留.jpg扩展名
- 您需要初始化$i,否则,如果尚未定义它,它将从0开始,或者更糟糕的是,如果以前在同一PowerShell会话中使用了$i,它将从其他数字开始。例如,如果目录中有1432.jpg文件,则首先使用-WhatIf运行命令,然后运行如果是真的,数字将从1432开始
- $i++将$i增加1。但是,如果将其用作值,则在读取该值后它将增加;这就是为什么如果$i未定义,它将从0开始
- Get ChildItem与ls相同。我使用了本机PowerShell名称,但它们可以互换(ls、dir和gci都是Get ChildItem的别名)
- %{}是每个对象的缩写
这接近原始问题。您实际上可以将脚本块数组传递给foreach对象-进程,如文档所述(几乎没有)。我只在Bruce Payette的书中知道这一点。包含的文件夹名为“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:\users\js\19981016\file1.jpg Destination: C:\users\js\19981016\19981016_0001.jpg".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\19981016\file10.jpg Destination: C:\users\js\19981016\19981016_0002.jpg".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\19981016\file2.jpg Destination: C:\users\js\19981016\19981016_0003.jpg".
您可以在powershell ISE中使用此代码块。输出示例如下:
旧文件:
1232.gif
asd.gif
运行后代码:
文件_1232.gif
file_asd.gif非常有用!感谢您提供的详细信息。.在哪里可以找到完整的文档?:/I无法找到准确的文章,但此线程,谢谢!@f00bar文档用于什么方面?此答案涵盖多个主题。如果您指的是批量文件重命名的文档,则没有任何文档,因为它不是真正的离散文档主题,而不是使用Rename Item将文件名馈送到循环的基本思想。有关如何创建新名称的文档将特定于您要执行的任何操作。例如,大多数批量重命名都将使用正则表达式替换来完成,此处甚至不涉及这些替换。在这种情况下,您将查找文档关于将是正则表达式替换,而不是批量文件重命名…如果您想了解字符串格式,官方术语是“复合格式字符串”,但您可以通过谷歌搜索“.net格式字符串”或“powershell格式字符串”或“powershell-f运算符”来获得更简洁直观的文档@AdiInbar谢谢你:)
,我在查找目录文件列表和字符串替换格式的详细信息时遇到了麻烦。我有一个类似的情况,我想知道如何才能生成只有奇数的序列,例如19981016_0001.jpg,19981016_0003.jpg,19981016_0005.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
}