我正在尝试替换文件夹中所有文件中的多个字符串。问题是-replace运算符没有考虑到我需要替换的确切单词,例如:
我需要替换字符串:
现在,当我运行脚本时,它将RUN字符串替换为Run,这很好,但是它将RUNMODAL也替换为RunMODAL,并且它没有考虑我的第二种情况。有什么方法可以指定只考虑完全匹配,或者至少对于每次替换我都指定替换特定字符串时要考虑的字符数?
$AllFiles = Get-ChildItem $FilePath
foreach ($file in $AllFiles) {
(Get-Content $file.PSPath) | ForEach {
$_ -creplace 'RUN', 'Run' `
-creplace 'RUNMODAL', 'RunModal'
} | Set-Content $file.PSPath
}
编辑:
也许更好的例子是:
即使我将它们切换为NEWfield或Newfield,也需要NewField。
答案 0 :(得分:1)
在搜索字符串中使用单词边界(\b
),以确保仅替换完整的单词。而且您不需要嵌套循环。替换运算符可以直接在列表上使用。
Get-ChildItem $FilePath | ForEach-Object {
(Get-Content $_.FullName) -creplace '\bRUN\b', 'Run' `
-creplace '\bRUNMODAL\b', 'RunModal' `
-creplace '\bFIELD\b', 'NewField' |
Set-Content $_.FullName
}
答案 1 :(得分:0)
$AllFiles = Get-ChildItem $FilePath
(Get-Content $file.PSPath) |
ForEach {
$_ -creplace 'RUNMODAL', 'RunModal' `
-creplace 'RUN', 'Run'
} | Set-Content $file.PSPath
答案 2 :(得分:0)
我确实找到了另一种解决方案:
foreach ($file in $AllFiles)
{
(Get-Content $file.PSPath) | ForEach-Object {
$line = $_
$lookupTable.GetEnumerator() | ForEach-Object {
if ($line -like $_.Key)
{
$line = $line -replace $_.Key, $_.Value
}
}
$line
} | Set-Content $file.PSPath
}
我也会尝试您的。谢谢!