簡體   English   中英

PowerShell 或 CMD - 文件的查找和增量字母(修訂管理)

[英]PowerShell or CMD - Find and Increment alphabet letter of files (revision management)

我需要一些幫助來自動重命名當前目錄中的文件。 目錄下可以存在的文件例如:

AAA111 .txt

AAA111 A .pdf

AAA111 A.jpg

BBB222 B.jpg

BBB222.pdf

其中粗體字母代表文件的修訂。 我想要的是一個 PowerShell 或批處理文件,它會自動查看它是什么修訂字母,然后將所有文件的字母表中的下一個修訂字母遞增。

例子:

AAA111 A .txt -> AAA111 B .txt

BBB222 B .pdf -> BBB222 C .pdf

ETC

修訂字母和文件擴展名之前的字母和數字可以不同,所以用作通配符? 該文件也可能被命名為:AAA111 A -01.pdf 或 AAA111 A -blabla.pdf

希望有人可以讓這個菜鳥的生活更輕松:)。

先感謝您!

如果您不在 PowerShell 核心上(像我一樣),您可以在[regex] class 上使用Replace() static 方法進行更高級的替換。 這給了我們一些靈活性,可以將匹配的字符更改為對應的integer ,我們可以在其中加1 ,然后將其改回其等效字母:

Get-ChildItem -Path '.\MyPath' | 
    Rename-Item -NewName {
        [regex]::Replace($_.BaseName,
            '[A-Z]$', {
                Param($match)
                $letter_int = [int][char]$match.Value + 1
                [char]$letter_int
            }
        ) + $_.Extension
    } -WhatIf

這不考慮您可能遇到的其他問題,例如重復的文件名,或者如聖地亞哥在評論中提到的,如果字母到達字母表的末尾則需要的邏輯。


當您指定要得到的結果時,請刪除-WhatIf安全通用參數。

建立在 Abraham 的答案之上,因為使用帶參數的腳本塊來評估替換非常好,而我在今天之前就不知道了。 我只是提前為替換字母設置了一個哈希表。 我會用aa替換z以避免沖突,假設這不會破壞命名約定。

$Letters=[hashtable]::new() #unconventional hashtable creation to create a hashtable with case sensitive keys
65..122|?{$_ -lt 90 -or $_ -gt 96}| #this gets up A through Z and a through z, skipping the other characters between the sets
    ForEach-Object{$Letters.add([string][char]$_, [string][char]($_+1))}
$Letters.'Z'='AA' #manually set rollover case
$Letters.'z'='aa' #manually set rollover case

獲得該設置后,您基本上可以按照 Abraham 的建議進行操作,只需引用哈希表即可獲取替換字符串。

Get-ChildItem C:\Path\To\Files*.txt|
    Rename-item -NewName {
        [regex]::replace($_.Name, '(?<=^[a-zA-Z0-9]+)([a-zA-Z])(?=\W)',{param($old)$Letters[$old.value]})
        }

這與亞伯拉罕的回答一樣失敗,因為它在嘗試重命名文件之前不檢查文件名可用性。 它確實解決了文件修訂為Z的情況。 對於文件名為“AAAA111C-glarb.txt”的情況,我的正則表達式也更靈活一些,並將正確地將其遞增為“AAAA111D-glarb.txt”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM