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