根据文件的内容有选择地更新文件中的行



我是PowerShell脚本的新手,我已经完成了PowerShell教程以完成我当前的脚本要求。

我试图通过匹配模式来在线路上添加感叹号。我有类似的测试。默认文件如下

"/AgentSetup/__type__"
"/AgentSetup/__name__"
"/AgentSetup/preloadedKs"
"/AgentSetup/preloadedKMsArch"
"/AgentSetup/loadOnlyPreloadedKMs"

文件中的更多类似行

因此,在这里我尝试通过匹配的匹配在线启动中添加单调印记>

"/AgentSetup/__type__"
"/AgentSetup/__name__"
"/AgentSetup/preloadedKs"
!"/AgentSetup/defaultAccount"
"/AgentSetup/preloadedKMsArch"
"/AgentSetup/loadOnlyPreloadedKMs"

我尝试了以下命令来实现这一目标,但没有成功

$TEST = "C:Assetconfig.default"
$Pattern = "/AgentSetup/defaultAccount"
$var = "!" + (Select-String -Path $TEST -pattern $Pattern | Out-String)
$var
$var + (Get-Content $TEST -Raw) | Set-Content $TEST

上面的命令不仅添加了单调性标记,而且在此类文件中添加了Doblicate条目:

!
test.default:103:"/AgentSetup/defaultAccount"

我已经通过了PowerShell Add-ContentSelect-String教程,即使我搜索了Get-Content。请指导我走向正确的方向,以便我可以实现这一目标。

您的方法有两个问题:

  • 正如Mathias R. Jessen在评论中所建议的那样,而不是将Select-String呼叫的输出输出到Out-String [1] ,请访问结果上的.Line属性,仅包含匹配的行。

    • Select-String不输出 strings ,它输出匹配信息 对象 .Line property 含匹配行(String)。

    • 请注意,有一个绿色功能建议 - 尚未使用Windows PowerShell Core 6.2.0-允许Select-String直接使用建议的-Raw Switch直接发射字符串 - 请参阅https://github.com/powershell/powershell/essugy/7713

  • 您只是简单地准备了输出的感兴趣线的修改副本,这意味着原始的,未修改的行仍然是重写文件的一部分

我建议基于-replace操作员完全使用其他方法,这使得解决方案既更简洁又更快:

(Get-Content $TEST) -replace '^"/AgentSetup/preloadedKs"$', '!$&' | Set-Content $TEST
  • ^匹配每个输入字符串的开始和 $末端,因此只有只包含搜索字符串的行。

  • $&是匹配的占位符,即在这种情况下的原始行;有关-replace和这些占位持有人的更多信息,请参阅此答案。

请注意,这会更新以其原始位置的线路。

封闭Get-Content(...)中呼叫确保在同一管道中以Set-Content的形式全面读取文件,从而使文件全面读取;虽然这很方便,但如果写回文件中断,它会略有数据丢失的风险。


[1] Out-String的目的是创建对象的字符串表示,因为它们将打印到控制台,通常不适合编程处理;即使在Match-Info对象上使用.ToString()(或将它们放入"...")也无法正常工作,因为结果表示也包括输入文件名。

相关内容

  • 没有找到相关文章

最新更新