【问题标题】:Bulk renaming of files in PowerShell with sequential numeric suffixes使用顺序数字后缀在 PowerShell 中批量重命名文件
【发布时间】:2013-08-18 21:53:31
【问题描述】:

我有 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 <<<<

错误重复了好几次。

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    语法太离谱了。几个问题:

    • 我不确定 $($.19981016) 打算产生什么,但 $( ) 计算括号中的表达式并将结果插入字符串中,您会收到错误,因为$.19981016不是一个有效的表达式。目录中的每个 .jpg 文件都会重复该错误。
    • 格式化字符串中的{0:00000000#} 将创建一个零填充的 9 位数字,但更短的方法是 {0:D9}。但是,我认为您希望零填充的数字有 4 位,所以应该是 {0:0000#}{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 开始,或者更糟糕的是,如果之前使用了 $i,则从其他数字开始在同一个 PowerShell 会话中。例如,如果您的目录中有 1,432 个 .jpg 文件,您先用 -WhatIf 运行命令,然后实际运行,则数字将从 1432 开始。
    • $i++$i 递增 1。但是,如果您将其用作值,它会在读取值之后 递增;这就是为什么如果 $i 未定义,它将从 0 开始。
    • Get-ChildItemls 相同。我使用了原生 PowerShell 名称,但它们可以互换(lsdirgci 都是 Get-ChildItem 的别名)。
    • %{ }Foreach-Object 的简写

    【讨论】:

    • 非常有用!感谢您提供详细信息。在哪里可以找到完整的文档? :/ 我找不到准确的文章,但是这个帖子,谢谢!
    • @f00bar 什么方面的文档?这个答案涵盖了几个主题。如果您指的是批量文件重命名的文档,那么除了使用 Rename-Item 将文件名提供给循环的基本思想之外,没有任何文档,因为它并不是一个真正的独立主题。有关如何创建新名称的文档将特定于您想要做的任何事情。例如,大多数批量重命名将通过正则表达式替换来完成,这里甚至不涉及。在这种情况下,您要查找有关文档的主题将是正则表达式替换,而不是批量文件重命名。
    • ...如果您想了解字符串格式,官方术语是“复合格式字符串”,the full documentation can be found at MSDN,但是您可以通过谷歌搜索“.net格式”获得更简洁直观的文档字符串”或“powershell 格式字符串”或“powershell -f 运算符”。
    • @AdiInbar 谢谢:),我很难找到有关循环目录文件列表和字符串替换格式的详细信息。
    • 我有一个类似的情况,我想知道如何生成一个只有奇数的序列,例如19981016_0001.jpg, 19981016_0003.jpg, 19981016_0005.jpg,... ?这是因为我有一个扫描文档,其中一个目录中的奇数页和另一个目录中的偶数页。
    【解决方案2】:

    这接近于原始问题。您实际上可以将脚本块数组传递给 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".
    

    【讨论】:

      【解决方案3】:
      $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.gif asd.gif

      运行代码后:

      file_1232.gif 文件_asd.gif

      【讨论】:

        猜你喜欢
        • 2018-01-09
        • 1970-01-01
        • 2014-04-22
        • 2017-01-01
        • 2017-03-07
        • 2010-11-19
        • 2023-03-25
        • 1970-01-01
        • 2014-10-05
        相关资源
        最近更新 更多