关于使用Powershell重命名文件和文件中的内容的问题,请遵循解决方案here。
使用下面的脚本,文件中的所有文件名和引用都将重命名。替换不区分大小写,即无论是否出现“uvw”、“UVW”、“UVw”等,替换都是“XYZ”。是否有可能尊重原件的情况,并重新命名为“真实原件”,即“uvw”->“xyz”,“UVW”->“XYZ”,“UVW”->“Xyz”(默认情况下“abc_123”也应该是“def_123”而不是“DEF_123”)?
$filePath = "C:\root_folder"
$include = '*.txt', '*.xml' # adapt as needed
Get-ChildItem -File $filePath -Recurse -Include $include |
Rename-Item -WhatIf -PassThru -NewName { $_.Name -replace 'UVW', 'XYZ' } |
ForEach-Object {
($_ | Get-Content -Raw) -replace 'ABC_123', 'DEF_123' |
Set-Content -NoNewLine -LiteralPath $_.FullName
}
2条答案
按热度按时间yqhsw0fo1#
Santiago's helpful answer的另一种方法,也依赖于为每个匹配调用的匹配评估器脚本块:
总的想法是:
System.Text.StringBuilder
示例逐字符构建替换文本的大小写匹配版本。两种解决方案均低于预期输出
<XyZ>
。PowerShell (Core) 7+解决方案:
-replace
的替换操作数):wpcxdonn2#
所以,这是令人难以置信的低效,但我没有看到一种方法,你需要使用一个匹配评估器和一个哈希表来Map匹配的字符与它们的替换字符。
代码看起来会有所不同,这取决于您是在PowerShell 7+上使用脚本块进行替换,还是在Windows PowerShell 5.1上使用脚本块进行替换,在Windows PowerShell 5.1上您需要调用
Regex.Replace
API来定位MatchEvaluator
重载之一。