我有一个特殊的需求,我觉得被卡住了…有些用户会把一些文件放在一个目录中,有几个不同的名字,我需要重命名它们,因为这些文件被另一个应用程序使用的特殊模式。
的例子:
目录->目标
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)"}}