多个文件的条件重命名 - Powershell

问题描述:

方案:具有多个文件的文件夹(最多有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

所以你可以使用像一个字母转换为数字:

[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