【问题标题】:batch rename files according to filenames in another folder with powershell使用powershell根据另一个文件夹中的文件名批量重命名文件
【发布时间】:2011-07-14 00:28:57
【问题描述】:

我在名为“01-aaa-bbb-ccc”、“02-ddd-eee-fff”等的文件夹中有大量文件。在另一个文件夹中,我有一个没有索引的相同文件的早期版本(手动添加以便按特定顺序对它们进行排序)“aaa-bbb-ccc”,“ddd-eee-fff”。我想使用早期版本,但我需要重命名它们,添加与其他文件夹中相同的索引。

基本上,类似:如果没有索引的文件名相同,则将文件夹 b 中的文件重命名为与文件夹 a 中的文件相同。

有没有办法在PowerShell中做到这一点?不幸的是,我的技能还不够好。 感谢您的帮助!

【问题讨论】:

    标签: powershell


    【解决方案1】:
    $ht = @{}
    Get-ChildItem a\* | Select-Object -ExpandProperty name | ForEach-Object {
      $null = $_ -match '(\d+)-(.*)'
      $ht[$Matches[2]] = $Matches[1]
    }
    Get-ChildItem b\* | ForEach-Object { Rename-Item $_ ($ht[$_.name] + '-' + $_.name) }
    

    首先我创建一个哈希表,其中包含文件名的映射,没有索引到要使用的索引。这随后用于相应地重命名文件夹 b 中的项目。

    【讨论】:

    • 嗨,非常感谢您的帮助。我试过了,但没有成功:它在文件名前加上 - (文件现在命名为“-aaa-bbb-ccc”),但它没有添加与其他文件夹中相同的索引号。如果我做对了,我用带索引号的文件夹替换 a\,用没有索引号的文件夹替换 b\
    • @Libero:确实,这就是我打算使用它的方式。实际上,它对我来说效果很好。
    【解决方案2】:
    Get-ChildItem .\a\* | Select -Expand Name | %{ $_ -match "([\d]+)-(.+)" }  | `
    %{ Rename-Item -WhatIf .\b\$($matches[2]) $matches[0] }
    

    【讨论】:

      【解决方案3】:

      这是一个类似的方法。在我的一小部分测试中工作:

      $newNames = Get-ChildItem ..\a -Name
      # Cd into b dir
      Get-ChildItem | Foreach {$name = $newNames -match "\d+-$_";if ($name){$_}} | 
                      Rename-Item -NewName {$name}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多