Powershell-从文本文件在多行之间读取

Powershell-从文本文件在多行之间读取,powershell,Powershell,因为我对powershell编程非常陌生。但是,我希望使用Powershell完成以下任务。我在尝试基于文件中的一些关键字config block(多个)进行基线检查时遇到了一些问题。我仅使用以下代码提取“界面”和“!”之间的文本: 当前代码: $fileContent = Get-Content C:\configs\configfile.txt -Raw $fileContent | Select-String '(?smi)interface GigabitEthernet([^!]+!)

因为我对powershell编程非常陌生。但是,我希望使用Powershell完成以下任务。我在尝试基于文件中的一些关键字config block(多个)进行基线检查时遇到了一些问题。我仅使用以下代码提取“界面”和“!”之间的文本:

当前代码:

$fileContent = Get-Content C:\configs\configfile.txt -Raw
$fileContent | Select-String '(?smi)interface GigabitEthernet([^!]+!)' -AllMatches |
%{ $_.Matches } |
%{ $_.Value }
configfile.txt

blah blah blah
blah blah blah
!
interface GigabitEthernet1/0/1
 description connected to router
 no cdp enable
!
interface GigabitEthernet1/0/2
 description connected to switch
!
 interface GigabitEthernet1/0/3
 no cdp enable
!
blah blah blah
blah blah blah
基线匹配标准:

$baseline = @("description", "no cdp enable")
预期结果:

******Missing config*****
interface GigabitEthernet1/0/2
 no cdp enable
!
******Missing config*****
interface GigabitEthernet1/0/3
description
!

我建议您使用状态机并逐行处理,而不是使用正则表达式来匹配整个块

  • 对于每个
    接口千兆以太网
    行,创建一个新的
    $entry
    对象。将所有内容初始化为false
  • 如果找到
    说明
    行,请将其
    $entry
    属性设置为true
  • 如果未找到
    无cdp启用
    行,请将其
    $entry
    属性设置为true
  • 如果关闭
    时,将
    $entry
    对象输出到流
  • 筛选描述或cdp属性为false的所有结果对象
  • 示例

    @"
    interface GigabitEthernet1/0/1
     description connected to router
     no cdp enable
    !
    interface GigabitEthernet1/0/2
     description connected to switch
    !
    interface GigabitEthernet1/0/3
     no cdp enable
    !
    "@ -split "`r`n" | % {
        switch -Regex ($_) {
            "interface GigabitEthernet" {$entry = [PSCustomObject]@{interface = $_;hasDescription = $false;hasCdp = $false}}
            "description"               {$entry.hasDescription = $true}
            "no cdp enable"             {$entry.hasCdp = $true} 
            "!"                         {$entry}
        }    
    } | ? {($_.hasDescription -eq $false) -or ($_.hasCdp -eq $false)}
    
    应用于您的文件,这将是

    $results = switch -File C:\configs\configfile.txt -Regex {
        "interface GigabitEthernet" {$entry = [PSCustomObject]@{interface = $_;hasDescription = $false;hasCdp = $false}}
        "description"               {$entry.hasDescription = $true}
        "no cdp enable"             {$entry.hasCdp = $true} 
        "!"                         {$entry}
    } 
    $results | ? {($_.hasDescription -eq $false) -or ($_.hasCdp -eq $false)}
    

    我建议您使用状态机并逐行处理,而不是使用正则表达式来匹配整个块

  • 对于每个
    接口千兆以太网
    行,创建一个新的
    $entry
    对象。将所有内容初始化为false
  • 如果找到
    说明
    行,请将其
    $entry
    属性设置为true
  • 如果未找到
    无cdp启用
    行,请将其
    $entry
    属性设置为true
  • 如果关闭
    时,将
    $entry
    对象输出到流
  • 筛选描述或cdp属性为false的所有结果对象
  • 示例

    @"
    interface GigabitEthernet1/0/1
     description connected to router
     no cdp enable
    !
    interface GigabitEthernet1/0/2
     description connected to switch
    !
    interface GigabitEthernet1/0/3
     no cdp enable
    !
    "@ -split "`r`n" | % {
        switch -Regex ($_) {
            "interface GigabitEthernet" {$entry = [PSCustomObject]@{interface = $_;hasDescription = $false;hasCdp = $false}}
            "description"               {$entry.hasDescription = $true}
            "no cdp enable"             {$entry.hasCdp = $true} 
            "!"                         {$entry}
        }    
    } | ? {($_.hasDescription -eq $false) -or ($_.hasCdp -eq $false)}
    
    应用于您的文件,这将是

    $results = switch -File C:\configs\configfile.txt -Regex {
        "interface GigabitEthernet" {$entry = [PSCustomObject]@{interface = $_;hasDescription = $false;hasCdp = $false}}
        "description"               {$entry.hasDescription = $true}
        "no cdp enable"             {$entry.hasCdp = $true} 
        "!"                         {$entry}
    } 
    $results | ? {($_.hasDescription -eq $false) -or ($_.hasCdp -eq $false)}
    

    你好,Lieven我试过你提供的方法,不知怎么的,如果列表很长(超过80+行接口,其余结果都是正确的,除非当它到达最后一个接口时,它会给我一个重复的错误结果。你知道吗

    configfile.txt的最后几个接口输出

    blah blah blah
    blah blah blah
    !
    interface GigabitEthernet1/0/1
     description connected to router
     no cdp enable
    !
    interface GigabitEthernet1/0/2
     description connected to switch
    !
     interface GigabitEthernet1/0/3
     no cdp enable
    !
    blah blah blah
    blah blah blah
    
    configfile.txt GigabitEthernet2/1/4的输出结果重复,结果不正确:

    接口描述hasCdp

    ---------                       -------------- ------
    interface GigabitEthernet2/0/47          False   True
    interface GigabitEthernet2/0/48          False   True
    interface GigabitEthernet2/1/1           False  False
    interface GigabitEthernet2/1/2           False  False
    interface GigabitEthernet2/1/3           False  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    

    你好,Lieven我试过你提供的方法,不知怎么的,如果列表很长(超过80+行接口,其余结果都是正确的,除非当它到达最后一个接口时,它会给我一个重复的错误结果。你知道吗

    configfile.txt的最后几个接口输出

    blah blah blah
    blah blah blah
    !
    interface GigabitEthernet1/0/1
     description connected to router
     no cdp enable
    !
    interface GigabitEthernet1/0/2
     description connected to switch
    !
     interface GigabitEthernet1/0/3
     no cdp enable
    !
    blah blah blah
    blah blah blah
    
    configfile.txt GigabitEthernet2/1/4的输出结果重复,结果不正确:

    接口描述hasCdp

    ---------                       -------------- ------
    interface GigabitEthernet2/0/47          False   True
    interface GigabitEthernet2/0/48          False   True
    interface GigabitEthernet2/1/1           False  False
    interface GigabitEthernet2/1/2           False  False
    interface GigabitEthernet2/1/3           False  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    interface GigabitEthernet2/1/4            True  False
    

    嗨,列文,这就是我要找的。谢谢你的帮助:)嗨,列文,这就是我要找的。谢谢你的帮助:)我不知道为什么它在你这边失败了,但是在works中使用了你的输入。我不知道为什么它在你那边失败了,但是在works中使用了你的输入。