【问题标题】:Find and Replace String Error查找和替换字符串错误
【发布时间】:2017-07-31 12:41:24
【问题描述】:

问题

“查找和替换”功能正在删除文件的内容,而不是按预期进行。

详情

我正在使用正则表达式值在 PowerShell 中工作,并且具有旨在查找特定正则表达式字符串并将其替换为另一个的函数。最初,该功能运行良好;但是,现在它正在删除目标文件的所有内容并将它们保存为空文件。我已经尝试了几个小时来找出问题所在。不幸的是,当它按预期工作时,我没有保存该函数的副本,所以我没有什么可比较的,而且我的大部分故障排除都失败了。我希望另一双眼睛可以帮助发现问题。

代码:

Function StringReplace
{
   $files = GCI -path "$path\*.config" -Recurse | where-object -InputObject $_ -Pattern ([regex]::Escape($oldString)) -Quiet) -eq $true)
   foreach ($file in $files) { 
      (GC $file.PSPath) | 
      foreach-object { $_.Replace($oldString, $newString) | 
         set-content $file.PSPath 
      }
}

$oldString = "s+r/ng"
$newString = "s/R+ng"
$path = "C:\*\somefoldername"

在我的大部分故障排除过程中,我发现所有 $values 都符合预期;但是,在到达 Get-Content 时,会发生一些事情并且 $file 值被复制,因此每个文件/内容大约存储了 20 个副本。我不确定我做错了什么,但我将不胜感激。

提前谢谢大家

【问题讨论】:

    标签: regex powershell str-replace


    【解决方案1】:

    显然我只是需要从应用程序中退后一步。

    对于遇到此问题的其他人来说,解决方法很简单。

    在代码的“ForEach-Object”部分,需要这样修改:

    foreach ($file in $files) { 
      (GC $file.PSPath) | 
      foreach-object { $_.Replace($oldString, $newString) } | 
      set-content $file.PSPath
    

    问题本身在于 } 的放置位置。 这部分功能需要在保存内容之前结束。

    【讨论】:

    • 如果您确实想手动将字符串逐个导出,可以使用Add-ContentOut-File -Append 代替Set-Content