gpt4 book ai didi

PowerShell 搜索文本并添加一行

转载 作者:行者123 更新时间:2023-12-03 22:17:23 27 4
gpt4 key购买 nike

抱歉发了这么长的帖子。想详细解释一下。我正在努力实现三件事并且非常接近目标。可能是小学生的错误。尝试了嵌套循环等,但无法使其正常工作。

看来我需要拆分 $resultszone 数组。

  1. 搜索文件中的特定区域。在下面的示例中,它是 \zones\、test1.in-addr.arpa、test2.in-addr.arpa 等之后的部分。
  2. 找到区域后复制和修剪内容。在第一个示例中,只是 test1.in-addr.arpa(删除开头的“\”和结尾的“]”
  3. 在包含“Type”的行下方添加一行,包括找到的区域(例如 test1.in-addr.arpa)。

示例源文件:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DNS Server\Zones\test1.in-addr.arpa]"Type"=dword:00000001"SecureSecondaries"=dword:00000002[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DNS Server\Zones\test2.in-addr.arpa]"Type"=dword:00000001"SecureSecondaries"=dword:00000002

Expected result

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DNS Server\Zones\test1.in-addr.arpa]"Type"=dword:00000001"DatabaseFile"="test1.in-addr.arpa.dns""SecureSecondaries"=dword:00000002[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DNS Server\Zones\test2.in-addr.arpa]"Type"=dword:00000001"DatabaseFile"="test2.in-addr.arpa.dns""SecureSecondaries"=dword:00000002

I've managed to achieve all using the code below, except it adds a line including all the results from area found, for every section.

For example:

"DatabaseFile"="test1.in-addr.arpa test2.in-addr.arpa
#Get FileName Path
$FileName = "C:\temp\test.conf"

#Search for pattern in file and trim to desired format.
#Store array in $resultsZone
$resultszone = Select-String -Path "c:\temp\test.conf" -Pattern '(?<=Zones)(.*)' |
select -expa matches |
select -expa value |
% { $_.Trim("\]") }

# Get contents of file
(Get-Content $FileName) | ForEach-Object {
#Start Loop to find area of File to insert line
$_ # send the current line to output
if ($_ -match "type") {
#Add Line after the selected pattern (type) including area trimmed
"""DatabaseFile" + """=""" + $resultszone + ".dns" + """"
}
} | Set-Content C:\temp\elctest.conf

最佳答案

我认为这实现了您正在寻找的东西:

$FileName = "C:\Temp\test.conf"

Get-Content $FileName | ForEach-Object {
$Match = ($_ | Select-String -pattern '(?<=Zones\\)(.*)').matches.value

if ($Match) { $LastMatch = ($Match).Trim("\]") }

$_

if ($LastMatch -and $_ -match 'type') {
"""DatabaseFile" + """=""" + $LastMatch + ".dns" + """"
}
} | Set-Content C:\Temp\elctest.conf

解决方法是我们在循环中针对每一行执行 Select-String,然后在它匹配时存储在另一个变量(名为 $LastMatch)中,以便当我们到达我们想要插入上一次匹配的行时,我们就拥有了它。

关于PowerShell 搜索文本并添加一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51611562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com