我需要在多个文件名中替换多个字符串。这是代表我的数据的代码。
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。
答案 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?我不知道。