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

时间:2016-03-01 19:59:44

标签: powershell rename multiple-files

场景:包含多个文件的文件夹(最多包含5个文件)。每个文件都以一个字符(不重复)开头,后跟数字。例如:A123,B234,C123 ......

目标:根据预定的映射重命名文件。例如:如果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,然后是组合重命名命令)。

这可以完成工作,但我真的很感激,如果有人能够简化事情并让我更方便地处理这种情况。

1 个答案:

答案 0 :(得分: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.$_"}

修改:好的,因此您的原始问题具有误导性,应进行编辑以更准确地表示您的请求。如果您没有指定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.$_"}}'