如何在文件名中替换多个字符串

3

我需要替换多个文件名中的多个字符串。以下是我的数据大致样子。

 CAL aB12 AUG.docx
CAL cDe345 AUG.docx
CAL FGHiJKL6789 AUG.docx 

我需要将文件名中的"CAL"替换为"Calendar",将"AUG"替换为"August"。

我能做到的最好方法是运行两个CMDlet(每个替换一个)并用分号链接起来。虽然这样可以实现,但我知道这很原始。

gci | Rename-Item -NewName { $_ -replace "CAL", "Calendar" };
gci | Rename-Item -NewName { $_ -replace "AUG", "August" }

经过大量搜索,我找到了StackOverflow 3403217。由于缺乏知识和经验,我尝试过很多次,但没有能够将其中的五个答案翻译成一个适用于我所需的单个cmdlet。
附言:我将感兴趣的文件副本粘贴到C:\ Temp中,并从那里开始工作。我正在使用Windows 7。
3个回答

1
尝试像这样的东西。
$hashreplace = @{}
$hashreplace.'old1' = 'new1'
$hashreplace.'old2' = 'new2'

Get-ChildItem -Recurse -File -Path "c:\temp\" | % {
    $filename = $_.FullName
    $text = $_.Name
    $hashreplace.Keys | %{if ($text -ne $null) {$text = $text.Replace($_, $hashreplace[$_]) } }
    Rename-Item -Path $filename -NewName $text
}

谢谢你,Esperento57。非常感谢你的帮助。虽然我相信你的解决方案是正确的,但它远超出了我的能力范围。下面是我能理解的解决方案。Get-Childitem | Rename-Item -NewName { ($_.name
-replace "cal", "calendar") -replace "aug", "August" }
- pwt12855

1
你所需要做的就是将替换操作进行串联:
gci | Rename-Item -NewName { $_.Name -replace "CAL","Calendar" -replace "AUG","August" }

正如评论中@Esperento57所提到的,-replace运算符可以进行正则表达式替换。在您的情况下,这没有任何区别,但如果您的搜索字符串包含特殊字符,则可能需要进行转义,例如:
gci | Rename-Item -NewName { $_.Name -replace [regex]::Escape("CAL"),"Calendar" -replace [regex]::Escape("AUG"),"August" }

或者您可以通过串联 Replace() 方法调用来进行简单的字符串替换:

gci | Rename-Item -NewName { $_.Name.Replace("CAL","Calendar").Replace("AUG","August") }

使用这个解决方案时,请小心 - 使用正则表达式替换(对于您的示例它是有效的)。 - Esperento57

-1
Get-Content List.txt |

  Where-Object \\{ $_ -match '^\\\\' \\} |

  ForEach-Object \\{ $_ -replace

  '^\\\\(\S+).+','$1' \\}

你基本上需要获取文本文件并查找任何想要的字符串匹配项,然后通过for循环运行以进行替换。为什么要在PowerShell中执行此操作?我不知道。

1
为什么要用PowerShell?我最初尝试在命令提示符(cmd)会话中执行,但它搞砸了文件名,如下所示。在我的命令提示符会话中应该怎么做才能不同呢?C:\ TEMP>dir             CAL ab123 AUG.doc              CAL cde45 AUG.doc              CAL fghijk6889 AUG.docC:\ TEMP>ren "CAL * Aug.doc" "calendar * August.doc"C:\ TEMP>dir             calendar3 August.doc              calendar5 August.doc              calendarjk6889 August.doc - pwt12855
在我提交回复之前,我的回复中有通配符星号。 - pwt12855
@pwt12855 哈哈,那只是个玩笑,别担心。我宁愿快速编写一个 C 程序并直接使用它,但这也取决于具体情况。我的回答足够了吗? - Imagine Dragons
这只是说明我在使用 bang-head-here 模式时变得多么不幽默了。今晚,我收到了你的解决方案和另一个解决方案。一个是来自 Get-Childitem | Rename-Item -NewName { ($_.name -replace "cal", "calendar") -replace "aug", "August" } 的。 - pwt12855
你可能已经猜到了,对于我来说,看起来熟悉的那个会更好用,因为我目前所知道的就这么多。非常感谢你的帮助。我会保存你的解决方案,等到我在 Powershell 学习曲线上更高时,就可以付诸实践了。 - pwt12855
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接