2016-03-01 52 views
-2

方案:具有多個文件的文件夾(最多有5個文件)。每個文件都以字符(不重複)開頭,後面跟着數字。例如:A123,B234,C123 ...多個文件的條件重命名 - Powershell

目標:根據預定的映射重命名文件。例如:如果A = 1,B = 2等,則以「A」開始的文件變爲「1.」,以「B」開始的文件變爲「2」。等等。例如:A123 => 1.A123

我的解決方案:我不熟悉PowerShell,但這裏是我嘗試實現上述目標。

powershell "cd C:\Temp ; dir | ForEach-Object{if ($_.Name -Like "A*") {Rename-Item $_ "1.$_"} else {if ($_.Name -like "B*") {Rename-Item $_ "2.$_"} else{if($_.Name -like "C*"){Rename-Item $_ "3.$_"}}}}" 

我需要從CMD以及在特定文件夾中執行的腳本(因此CD,然後由重命名命令)。

這樣做可以完成工作,但如果有人能簡化一些事情並向我展示處理這種情況時更漂亮的方式,我將非常感激。

+0

那麼,數字文件從1開始,並按順序進行?或基於文件的第一個字符的數字文件?所以你有一個A123,B456和F789的文件夾。他們變成1.A123,2.B456和3.F789嗎?或者它們變成1.A123,2.B456和5.F789? – TheMadTechnician

+0

基於第一個字符的文件名。就像您的示例中的1.A123,2.B456和5.F789一樣。 – MaveriK

回答

2

所以你可以使用像一個字母轉換爲數字:

[int][char]"F" 

這將輸出70。因此,您的需求,您只需要獲取文件名的第一個字符,這是一個簡單SubString(0,1)電話,然後通過ToUpper()運行它,以確保你沒有得到任何小寫字母,然後做[int][char]位給它,並減去64

powershell "cd C:\Temp ; dir | ForEach-Object{$NewNameNum = [int][char]$_.Name.Substring(0,1).ToUpper() - 64;Rename-Item $_ "$NewNameNum.$_"} 

編輯:Ø k,所以你的原始問題是誤導性的,應該進行編輯以更準確地表示你的請求。如果你沒有分配A = 1,B = 2,C = 3作爲直接翻譯,我可以看到2個不錯的選項。首先是散列表查找。

PowerShell "$NmbrConv = @{'A'=3;'B'=1;'C'=9;'D'=2};dir c:\temp\*|%{$NewNameNum = $NmbrConv[$_.Name.Substring(0,1)];Rename-Item $_ "$NewNameNum.$_"} 

這定義了字母轉換成什麼數字,然後爲每個文件只是引用了哈希表來獲取數。

另一個選項是Switch命令。在線運行會帶來一種醜陋,但是它的格式很好。

Switch(GCI C:\Temp){ 
    "^a" {$NewNameNum=3} 
    "^b" {$NewNameNum=1} 
    "^c" {$NewNameNum=9} 
    "^d" {$NewNameNum=2} 
    default {Rename-Item $_ "$NewNameNum.$_"} 
} 

然後,如果你需要它在一行中,你刪除新的行,並用分號替換它們。

powershell 'Switch(GCI C:\Temp){"^a" {$NewNameNum=3};"^b" {$NewNameNum=1};"^c" {$NewNameNum=9};"^d" {$NewNameNum=2};default {Rename-Item $_ "$NewNameNum.$_"}}' 
+0

非常感謝@TheMadTechnician。但是,你能否幫助我以更好的方式寫下if else結構。原因是我有一個隨機關係而不是給定的簡單關係。即我需要分別替換A => 3,B => 1,C => 9,D = 2等而不是1,2,3,4。 – MaveriK

+0

然後你最好創建一個哈希表來引用,或使用'Switch'命令。 – TheMadTechnician