[英]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.