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

时间:2017-01-03 05:31:30

标签: powershell

我需要在多个文件名中替换多个字符串。这是代表我的数据的代码。

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,该cmdlet适用于我正在尝试的内容。

P.S。我将感兴趣的文件的副本粘贴到C:\ Temp并从那里开始工作。我正在使用Windows 7。

3 个答案:

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

答案 1 :(得分: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") }

答案 2 :(得分:-1)

Get-Content List.txt |

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

  ForEach-Object \\{ $_ -replace

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

你基本上需要获取文本文件并找到你想要的任何String的匹配项并通过for循环运行以替换它。为什么在Powershell?我不知道。