【问题标题】:Rename files with a sequence number on a per-folder basis使用每个文件夹的序列号重命名文件
【发布时间】:2018-02-28 22:19:20
【问题描述】:

我需要为很多文件夹中的文件编号。

我使用了以下内容:

Get-ChildItem -Recurse -Include *.* | ForEach-Object -Begin { $count = 1 } -Process { Rename-Item $_ -NewName "image_$count.jpg"; $count++ }

它可以工作,但问题是文件夹之间的编号仍在继续。

例如:

\folder1
image_1.jpg
image_2.jpg
image_3.jpg

\folder2
image_4.jpg
image_5.jpg
image_6.jpg

...

我需要的是在每个文件夹结束并且重命名从下一个文件夹中的数字 1 开始时停止计数。

谢谢。

【问题讨论】:

  • 在进程块中...if($_.PsIsContainer){$count = 1}
  • @EBGreen 如果有更多嵌套文件夹,这可能不起作用

标签: powershell sequence directory


【解决方案1】:

您可以使用哈希表,其键是文件各自的父目录路径来维护每个目录的序列号:

Get-ChildItem -File -Recurse -Include *.* | 
 ForEach-Object { $ht = @{} } { 
   $nextNum = ++$ht[$_.DirectoryName]
   Rename-Item $_.fullname "image_$nextNum.jpg" -WhatIf
 }

如果担心哈希表过大,您可以在$nextNum = ... 行之前插入以下语句,以确保只维护1 个条目:
if (-not $ht[$_.DirectoryName]) { $ht.Clear() }

请注意,++$ht[$_.DirectoryName] 利用了这样一个事实:哈希表条目是按需创建的,具有$null 值,并且将++ 应用于$null L 值会产生1

【讨论】:

    【解决方案2】:

    编辑: 在所有 cmets 之后,这是一个更好的答案

    $directoryName = $null
    $count = 1
    Get-ChildItem -File -Recurse -Include *.* | 
    ForEach-Object {
        if ($directoryName -eq $null -or $directoryName -ne $_.DirectoryName) {
            $directoryName = $_.DirectoryName
            $count = 1
        }
    Rename-Item $_.fullname "image_$count.jpg" -WhatIf
    $count++
    }
    

    【讨论】:

    • 谢谢伙计。但我收到一个错误:无法在“imageABC.jpg”重命名项目,因为项目不存在。
    • 所有文件都会发生这种情况。文件存在,但重命名不起作用。
    • 行:4 个字符:61 + ForEach-Object -Begin { $count = 1 } -Process { Rename-Item $_ -NewN
    • 你可能需要 -NewName ("image_" +$count + ".jpg")
    • @HeedfulCrayon 您可以访问不带括号的变量的属性,如果您根据答案构建字符串,有时会导致问题。由于您在变量中有一个整数存储,因此在这种情况下应该不是问题。但我发现无论变量的值如何,我的方法都是最可预测和最可靠的。
    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2021-04-10
    • 2013-05-25
    相关资源
    最近更新 更多