FOR 循环以匹配文件中的名称,然后从第二个文件中获取 4 个值

FOR loop to match a name from file then get 4 values from second file

嗨,我需要一些帮助才能让它工作:) 我有一个列表中有名称的文件。 文件 A.

SomeNameA
SomeNameB
SomeNameC
etc

现在我需要从文件 B 中获取一组行:

ddrObjId_1=SomeNameA
adrrObjType_1=8
adrrObjZone_1=ZONE_A
addrObjIP_1=0.0.0.0
addrObjIP2_1=0.0.0.0
addrObjId_2=SomeNameB
adrrObjType_2=8
adrrObjZone_2=ZONE_B
addrObjIP_2=0.0.0.0
addrObjIP2_2=0.0.0.0

从值与文件 A 中的一个名称匹配的行开始,然后是所有后续行,直到在文件末尾找到另一个匹配项。希望这能更好地解释它:)

所以当我完成后,我需要用数据生成一个新的 FILE C:

address-object SomeNameA
type 1
host 0.0.0.0
mask 0.0.0.0
zone ZONE_A    
address-object SomeNameB
type 8
host 0.0.0.0
mask 0.0.0.0
zone ZONE_B
etc

所以我一直在尝试一些不同的脚本,在 StackO 上找到了她,我现在可以扫描文件从我的文件中找到一个词,它获取数据,所以我需要它来获取值,然后创建一个新的文件 包含命令。等.. 这里是代码不工作,但它是一个开始。希望有人能帮我弄明白..

Clear-Host
$array = @('SomeNameA')


$found = @{}
Get-Content 'D:\Scripts\FileB.txt'| % {
  $line = $_
  foreach ($item in $array) {
    if ($line.Split('=')[1] -like $item) { $found[$item] = $true }
        foreach ($item in $line | Where-Object{$_ -like 'addrObjId_*=*' -or $_ -like 'addrObjType_*=*'}) {
        write-host $item
        }
  }
}

$found.Keys | Out-File "C:\results.txt"

这应该可以完成工作:

$names = cat '.\fileA.txt'
$data =  cat '.\fileB.txt'
$outfile = '.\fileC.txt'

rm -Force $outfile

foreach($d in ([string]$data -split 'addrObjId_\d+='))
{
    if ($d -eq "") { continue }

    $d = $d -split ' '

    $obj = $d[0].Trim()
    $type = ($d[1] -split "=")[1]
    $zone = ($d[2] -split "=")[1]
    $hostip = ($d[3] -split "=")[1]
    $maskip = ($d[4] -split "=")[1]   

    if ($names.Contains($obj))
    {
        "address-object $obj" | Out-File -Append -FilePath $outfile
        "type $type" | Out-File -Append -FilePath $outfile
        "host $hostip" | Out-File -Append -FilePath $outfile
        "mask $maskip" | Out-File -Append -FilePath $outfile
        "zone $zone" | Out-File -Append -FilePath $outfile
    }
}

她是我最后用的代码:) 谢谢

metix

Clear-Host
$names = cat 'FileA.txt'
$data =  cat 'FileB.txt'
$outfile = 'C:\Temp\output.txt'
if(test-path $outfile){Remove-Item $outfile}

foreach($d in ([string]$data -split 'addrObjId_\d+='))
{
    if ($d -eq "") { continue }

    $d = $d -split ' '

    $obj = $d[0].Trim()
    $type = ($d[2] -split "=")[1]
    $zone = ($d[3] -split "=")[1]
    $hostip1 = ($d[5] -split "=")[1]
    $hostip2 = ($d[6] -split "=")[1]     

    if ($names.Contains($obj))
    {
        "address-object ipv4 $obj" | Out-File -Append -FilePath $outfile
        if ($type -eq '4'){"network $hostip1 $hostip2" | Out-File -Append -FilePath $outfile}elseif($type -eq '1'){"host $hostip1" | Out-File -Append -FilePath $outfile}elseif($type -eq '2'){"range $hostip1 $hostip2" | Out-File -Append -FilePath $outfile}
        "zone $zone" | Out-File -Append -FilePath $outfile
    }
}