14

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

我希望将所有图片命名为19981016_0001 19981016_0002等。我尝试了多个建议,但没有奏效。

我可以达到列出我想要更改的文件夹的程度,但我无法实际更改它。我所有的图片都是.jpg。

尝试 创建副本的临时文件以防我搞砸了。我开始输入,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 <<<<

错误重复了好几次。

我在网上找到了几个公式,但大多数创建的文件都会用括号编号,例如假期 (1).jpg。我想要一个四位数的计数器,在我的日期末尾的下划线后,例如19981016_0001

4

3 回答 3

49

语法很离谱。几个问题:

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

如果我正确理解描述,这将满足您的要求:

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

文件名将是19981016_0001.jpg19981016_0002.jpg19981016_0003.jpg等。

几点注意事项:

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

这接近原始问题。您实际上可以将脚本块数组传递给 foreach-object 进程,如文档所述(几乎没有)。我只有在布鲁斯·佩耶特的书之后才知道这一点。包含文件夹名称为“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".
于 2019-07-01T22:20:36.173 回答
0
$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章

运行代码后:

文件_1232.gif 文件_asd.gif

于 2020-06-20T07:29:49.937 回答