场景:包含多个文件的文件夹(最多包含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,然后是组合重命名命令)。
这可以完成工作,但我真的很感激,如果有人能够简化事情并让我更方便地处理这种情况。
答案 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.$_"}}'