【问题标题】:FOR loop to match a name from file then get 4 values from second fileFOR 循环以匹配文件中的名称,然后从第二个文件中获取 4 个值
【发布时间】:2016-10-13 07:14:42
【问题描述】:

您好,我需要一些帮助才能使其正常工作 :) 我有一个名称在列表中的文件。 文件 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"

【问题讨论】:

    标签: arrays powershell foreach multiline fileparsing


    【解决方案1】:

    这应该可以完成工作:

    $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
        }
    }
    

    【讨论】:

    • 谢谢你的脚本,我会试一试,让你知道它是怎么回事:)
    • 我在我的文件 B 中看到一个错误.. addrObjId_1 是连续的,所以接下来是 addrObjId_2 等等.. 直到 4k somthing :)
    • 那么我可以在这里使用 foreach($d in ([string]$data -split 'addrObjId_+=')) 吗?
    • 现在它运行通过然后在 if ($names.Contains($obj)) 之后停止,但它似乎是正确的,只是需要一些调整。
    • 我添加了正则表达式拆分,并修复了文件附加错误;)
    【解决方案2】:

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

    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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      相关资源
      最近更新 更多