我是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-Content
和Select-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()
(或将它们放入"..."
)也无法正常工作,因为结果表示也包括输入文件名。