【问题标题】:Bulk renaming photos and adding letters to duplicate file names in Powershell在 Powershell 中批量重命名照片并添加字母以重复文件名
【发布时间】:2020-12-26 05:21:55
【问题描述】:

我有一个关于 powershell 脚本的问题。我想重命名文件夹中的一堆照片。我有一个旧名称和新名称的 .csv 文件。这是该文件的一部分:

旧文件新文件 {5858AA5A-DB1B-475A-808E-0BFF0B885E5B}.jpeg 975NNNN-AGUIRRESUGARASSOCSTACK-Notes-20200828.jpeg {FA1E4CEE-0AD8-4B40-A5AD-4BB22C0EE4F0}.jpeg 975NNNN-AGUIRRESUGARASSOCSTACK-Other-20200828.jpeg {FD20FA44-B3D2-4A6A-B73D-F3BADC2DDE71}.jpeg 975NNNN-AGUIRRESUGARASSOCSTACK-Vicinity-20200831.jpeg {E0DDA4CD-7783-417C-9BE0-705FFA08CD17}.jpeg 975NNNN-AGUIRRESUGARASSOCSTACK-Vicinity-20200831.jpeg {76DC6315-942D-444C-BA04-92FC9B9FF1A5}.jpeg 975NNNN-AGUIRRESUGARASSOCSTACK-Vicinity-20200831.jpeg {3C853453-0A0D-40B5-B3B7-B0F84F92D512}.jpeg 975NNNN-AGUIRRESUGARASSOCSTACK-Vicinity-20200831.jpeg

许多新文件名将重复。对于这些文件,我想在名称中间的确切位置添加一个字母(A、B、C 等)。

例如,如果文件 975NNNN-AGUIRRESUGARASSOCSTACK-Vicinity-20200831.jpeg 是重复文件,我想在“Vicinity”之后添加“A”,以便文件名为 975NNNN-AGUIRRESUGARASSOCSTACK-VicinityA-20200831 .jpeg。该字母将始终位于完全相同的位置(就在第三个 - 之前)。

这是我目前的脚本。我知道这是不对的,我什至无法尝试在脚本中添加字母。 (我是一个完整的 Powershell 新手。)

$filesToRename = Import-CSV C:\Users\clair\OneDrive\Documents\JOA\batch_photos\Rename_Central_Aguirre.csv   
foreach ($file In $filesToRename) {
    if (Test-Path $file.NewFile) {
        $letter = -begin { $count= 1 } -Process { Rename-Item $file.OldFile
            "file-$([char](96 + $count)).jpeg"; $count++}
    } else {
        Rename-Item $file.OldFile $file.NewFile
    }
}

我能得到一些关于如何实现这个文件命名系统的指导吗?

谢谢!!!

【问题讨论】:

  • 请不要发布代码/错误/示例数据的图像。为什么? lookee ... >>> 为什么在提问时不上传代码/错误的图像? - 元堆栈溢出 — meta.stackoverflow.com/questions/285551/…
  • @Lee_Dailey 这是来自excel的样本数据图片。如果不变成图片,我不知道如何发布它
  • CSV 文件不是 excel 文件。 [grin] 它们是结构化的纯文本文件。 ///// 如果你真的有一个 excel 文件并且希望人们能够在这个问题中使用它,那么它需要是文本。您可以在 excel 中选择它并将其粘贴为 纯文本,或者将其导出为 CSV 文件并使用记事本复制信息。
  • @Lee_Dailey 谢谢!我已经更新了它。 (我完全是新手)
  • 整洁!现在,请将示例包装在代码标记中,以方便人们阅读... [grin]

标签: powershell rename


【解决方案1】:

使用字母表中的字符重命名文件意味着您将只有 26 个选项。如果这对您来说足够了,您可以执行以下操作:

$alphabet      = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
$folderPath    = 'D:\Test'
$filesToRename = Import-CSV C:\Users\clair\OneDrive\Documents\JOA\batch_photos\Rename_Central_Aguirre.csv

foreach ($file In $filesToRename) {
    $oldFile = Join-Path -Path $folderPath -ChildPath $file.OldFile
    if (Test-Path $oldFile -PathType Leaf) {
        # split the new filename into workable parts
        $newName = $file.NewFile
        $extension = [System.IO.Path]::GetExtension($newName)
        $parts = [System.IO.Path]::GetFileNameWithoutExtension($newName) -split '-'
        $suffix = $parts[-1]
        $prefix = $parts[0..($parts.Count -2)] -join '-'
        $charToAppend = 0    # counter to go through the characters in the alphabet. 0..25
        while (Test-Path (Join-Path -Path $folderPath -ChildPath $newName) -PathType Leaf) {
            if ($charToAppend -gt 25) {
                # bail out if al characters have been used up
                throw "Cannot rename file '$($file.OldFile)', because all characters A-Z are already used"
            }
            $newName = '{0}{1}-{2}{3}' -f $prefix, $alphabet[$charToAppend++], $suffix, $extension
        } 
        Rename-Item -Path $oldFile -NewName $newName
    }
    else {
        Write-Warning "File '$($file.OldFile)' not found"
    }
}

之前:

D:\TEST
    {3C853453-0A0D-40B5-B3B7-B0F84F92D512}.jpeg
    {5858AA5A-DB1B-475A-808E-0BFF0B885E5B}.jpeg
    {76DC6315-942D-444C-BA04-92FC9B9FF1A5}.jpeg
    {E0DDA4CD-7783-417C-9BE0-705FFA08CD17}.jpeg
    {FA1E4CEE-0AD8-4B40-A5AD-4BB22C0EE4F0}.jpeg
    {FD20FA44-B3D2-4A6A-B73D-F3BADC2DDE71}.jpeg

之后:

D:\TEST
    975NNNN-AGUIRRESUGARASSOCSTACK-Notes-20200828.jpeg
    975NNNN-AGUIRRESUGARASSOCSTACK-Other-20200828.jpeg
    975NNNN-AGUIRRESUGARASSOCSTACK-Vicinity-20200831.jpeg
    975NNNN-AGUIRRESUGARASSOCSTACK-VicinityA-20200831.jpeg
    975NNNN-AGUIRRESUGARASSOCSTACK-VicinityB-20200831.jpeg
    975NNNN-AGUIRRESUGARASSOCSTACK-VicinityC-20200831.jpeg

【讨论】:

  • 这似乎应该可以工作,但是当我运行它时(在我的文件夹路径中添加字幕之后),什么也没发生。你知道发生了什么吗?
  • @ClaireSchmidt 好的,我在原来的答案中拼错了$alphabet,但是由于我是通过代码完成的,所以当我测试它时它仍然运行良好。我刚刚再次测试并将结果放在我的答案中以显示结果。我的假设是您的 CSV 具有用逗号分隔的值。也许您的不是,并且这些值可能被另一个字符分隔(可能是空格?)。在这种情况下,将 -Delimiter ' ' 添加到 Import-Csv 命令中。请在记事本中打开并检查文件中的分隔符。
【解决方案2】:

我认为您需要使用 method.Insert()。这是一个如何工作的小例子:

我在 C:\Test 中创建了一个名为 975NNNN-AGUIRERRM1-Vicinity-20200829.txt 的 txt,仅用于测试目的,在您的示例中,第一行代码是识别重复项

#Code to identify duplicates (insert your code instead of mine)
$files=Get-ChildItem -Path C:\Test -File  -Name

#The following line indentifies the location of the last "-" (I understand you always have 3 "-" right?)
$DashPos=($files).LastIndexOf("-")

#This inserts on the position $DashPos, the letter "A")
$files.Insert($DashPos,"A")

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2021-03-06
    • 2013-10-28
    相关资源
    最近更新 更多