在Powershell中使用CSV重命名多个文件



我有一个特殊的需求,我觉得被卡住了…有些用户会把一些文件放在一个目录中,有几个不同的名字,我需要重命名它们,因为这些文件被另一个应用程序使用的特殊模式。

的例子:

目录->目标

file1-dd-mm-yyyy→file1

file2→thisfile2

flie45224→file123

如你所见,这可以是一些变量,日期,ID等。目标将始终是相同的,但源中的文件可能因日期而不同,例如

首先我有两个文件,所以我以纯文本形式编写脚本"如果test-path blabla执行此操作,则输出"但现在看来,我将有37个不同的文件,所有不同的名称。所以我考虑使用excel表格(CSV?),但我真的找不到任何帮助。

我们的目标是将一个表单作为"pattern";比如,如果你在'A1'中找到文件,那么将其重命名为'A2'等等…你们有什么主意吗?

提前感谢:)

我知道您需要一个具有以下列的csv:

  • A1: regex/pattern匹配
  • A2:转换规则动态

如果你想使用像文件名这样的变量,技巧是使用scriptblock

基本上,您的csv将是:

A1;A2
"^file1-dd-dd-dddd$";"file1"
"^file2$";"this$($file.Name)"
"^flie*";"file123"

代码是:

$myRules = Import-Csv "C:xxxtest.csv" -Delimiter ";"
$files = gci C:temp
foreach ($file in $files) {
    foreach ($rule in $myRules) {
        if ($file.Name -match $rule.A1) {
            Write-host "$($file.Name) is matching pattern ""$($rule.A1)"". Applying rename to ""$($rule.A2)"""
            $NewScriptBlock = [scriptblock]::Create("rename-item -Path $($file.FullName) -NewName ""$($rule.A2)""")
            $NewScriptBlock.Invoke()
        }
    }
}

file1-01-02-0344
file2           
flie45224

执行时输出:

file1-01-02-0344 is matching pattern "^file1-dd-dd-dddd$". Applying rename to "file1"
file2 is matching pattern "^file2$". Applying rename to "this$($file.Name)"
flie45224 is matching pattern "^flie*". Applying rename to "file123"

之后:

file1          
thisfile2
file123        

第一个foreach正在解析文件。然后,对于每个文件,我们检查其中一个规则是否匹配,这要归功于-match $rule.A1 .

对于第一个示例,您可以使用regexp (d来匹配数字)。对于其他情况,我保持简单,因为你没有明确的规则,但这将是你的作业:)

然后在转换规则中,您可以使用第二个转换规则中所示的文件名变量:this$($file.Name)

注意:在重命名后为当前文件添加一个标志以离开循环可能是一个好主意,以避免不必要的检查,并在文件没有匹配任何模式时显示一条消息。

似乎有点奇怪,我怀疑您应该能够使用正则表达式模式而不是没有看到csv内容就不能说。否则试试这个。假设CSV有名为First和Second的列头,First匹配文件的基本名(没有扩展名),Second包含您想要更改的基本名。

$csv = Import-Csv -Path c:filenames.csv
Get-ChildItem -Path c:temp | %{if($csv.First -contains $_.BaseName){Rename-Item -Path $_.FullName -NewName "$($csv.Second[$csv.First.IndexOf($_.BaseName)]+$_.Extension)"}}

最新更新