Парсинг файла конфигурации Cisco c помощью powershell

Всем привет!

Решаю задачку по написанию небольшого скрипта для поиска и вывода информации.

На входе у нас файл конфигурации от cisco и powershell.

Нужно искать в файле слово и выводить информацию, но уже блоком.

Для примера:

! interface FastEthernet0/2
switchport access vlan 100
switchport mode access
switchport nonegotiate
switchport voice vlan 92 switchport port-security maximum 3
switchport port-security violation restrict
switchport port-security no cdp enable
spanning-tree portfast edge
spanning-tree bpduguard enable !

То есть ищем например interface FastEthernet0/2 или FastEthernet0/2 , а выводим:

Hostname Имя интерфейса
и его настройки до знака !.

есть Код уже немного работающий за исключением поиска по папке( он не работает...почему, не знаю.)

помогите разобраться пожалуйста.

Add-Type -AssemblyName System.Windows.Forms

# Создаём форму
$form = New-Object System.Windows.Forms.Form
$form.Width = 1000
$form.Height = 800
$form.Text = "Поиск текста в файле"
$form.StartPosition = "CenterScreen"

# Создаём текстовые поля
# Поле вывода пути
$filePathTextBox = New-Object System.Windows.Forms.TextBox
$filePathTextBox.Location = New-Object System.Drawing.Point(10, 10)
$filePathTextBox.Size = New-Object System.Drawing.Size(900, 25)
$form.Controls.Add($filePathTextBox)
# Поле ввода текста для поиска
$searchTextTextBox = New-Object System.Windows.Forms.TextBox
$searchTextTextBox.Location = New-Object System.Drawing.Point(10, 40)
$searchTextTextBox.Size = New-Object System.Drawing.Size(900, 25)
$form.Controls.Add($searchTextTextBox)

# Кнопка для выбора файла
$openFileButton = New-Object System.Windows.Forms.Button
$openFileButton.Location = New-Object System.Drawing.Point(10, 70)
$openFileButton.Size = New-Object System.Drawing.Size(100, 25)
$openFileButton.Text = "Открыть файл"
$openFileButton.Add_Click({
    # Обработка события клика по кнопке
    $openFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    $openFileDialog.Filter = "Все файлы (*.*)|*.*"
    $openFileDialog.ShowDialog() | Out-Null
    $filePathTextBox.Text = $openFileDialog.FileName
})
$form.Controls.Add($openFileButton)

# Кнопка для выбора папки
$openFolderButton = New-Object System.Windows.Forms.Button
$openFolderButton.Location = New-Object System.Drawing.Point(120, 70)
$openFolderButton.Size = New-Object System.Drawing.Size(100, 25)
$openFolderButton.Text = "Открыть папку"
$openFolderButton.Add_Click({
    # Открытие диалога для выбора папки
    $openFolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
    $openFolderDialog.ShowDialog() | Out-Null
    $folderPath = $openFolderDialog.SelectedPath 
    $filePathTextBox.Text = $folderPath
})
$form.Controls.Add($openFolderButton)

# Кнопка для поиска в файле
$findButton = New-Object System.Windows.Forms.Button
$findButton.Location = New-Object System.Drawing.Point(230, 70)
$findButton.Size = New-Object System.Drawing.Size(100, 25)
$findButton.Text = "Найти"
$findButton.Add_Click({
    # Поиск текста в файле
    $filePath = $filePathTextBox.Text
    $searchText = $searchTextTextBox.Text
    
    if (-not [System.IO.File]::Exists($filePath)) {
        $resultLabel.Text = "Файл не найден" } else {
 $results = Get-Content $filePath | Where-Object { $_ -match $searchText }
        $resultLabel.Text = $results -join [Environment]::NewLine
    }
})
$form.Controls.Add($findButton)


# Кнопка для поиска в папке
$findButtonfolder = New-Object System.Windows.Forms.Button
$findButtonfolder.Location = New-Object System.Drawing.Point(340, 70)
$findButtonfolder.Size = New-Object System.Drawing.Size(100, 25)
$findButtonfolder.Text = "Найти в папке"
$findButtonfolder.Add_Click({
    # Получаем путь к папке и текст для поиска
    $filePath = $filePathTextBox.Text
    $searchText = $searchTextTextBox.Text

    # Получаем содержимое всех файлов в папке и ее подпапках
    $results = Get-ChildItem -Path $filePath | Where-Object { $_.PSIsContainer -eq $false -and $_.FullName -like "*$searchText*" }

    # Форматируем результаты и выводим их в метку
    $resultLabel.Text = ($results | ForEach-Object { $_.Path }) -join [Environment]::NewLine
})
$form.Controls.Add($findButtonfolder)

# Метка для вывода результатов поиска
$resultLabel = New-Object System.Windows.Forms.Label
$resultLabel.Location = New-Object System.Drawing.Point(10, 150)
$resultLabel.Size = New-Object System.Drawing.Size(900, 700)
$form.Controls.Add($resultLabel)


# Кнопка для выбора пути и сохранения результатов поиска
$saveAndSelectPathButton = New-Object System.Windows.Forms.Button
$saveAndSelectPathButton.Location = New-Object System.Drawing.Point(450, 70)
$saveAndSelectPathButton.Size = New-Object System.Drawing.Size(150, 25)
$saveAndSelectPathButton.Text = "Выбрать путь и сохранить"
$saveAndSelectPathButton.Add_Click({
    # Открытие диалога для выбора пути сохранения
    $saveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
    $saveFileDialog.Filter = "Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*"
    $saveFileDialog.ShowDialog() | Out-Null
    $savePathTextBox.Text = $saveFileDialog.FileName
    
    # Сохранение результатов поиска в файл
    $filePath = $filePathTextBox.Text
    $searchText = $searchTextTextBox.Text
    
    if (-not [System.IO.File]::Exists($filePath)) {
        $resultLabel.Text = "Файл не найден"
    } else {
        $results = Get-Content $filePath | Where-Object { $_ -match $searchText }
        $results | Out-File -FilePath $savePathTextBox.Text -Encoding utf8
        $resultLabel.Text = "Результаты сохранены в файл $($savePathTextBox.Text)"
    }
})
$form.Controls.Add($saveAndSelectPathButton)

# Текстовое поле для отображения пути сохранения
$savePathTextBox = New-Object System.Windows.Forms.TextBox
$savePathTextBox.Location = New-Object System.Drawing.Point(600, 70)
$savePathTextBox.Size = New-Object System.Drawing.Size(310, 25)
$form.Controls.Add($savePathTextBox)


# Кнопка закрытия формы
$closeButton = New-Object System.Windows.Forms.Button
$closeButton.Location = New-Object System.Drawing.Point(10, 100)
$closeButton.Size = New-Object System.Drawing.Size(100, 25)
$closeButton.Text = "Закрыть"
$closeButton.Add_Click({
    $form.Close()
})
$form.Controls.Add($closeButton)



# Показываем форму
$form.ShowDialog()

Ответы (1 шт):

Автор решения: Dyakov Alexander

Если необходим вывод строк в виде массива, то можно попробовать так:

$content = get-content $filepath
$linenumber = ($content | select-string $Searchtext).LineNumber
$results = for ($i = ($linenumber - 1); $i -lt $content.Count; $i++) {                                                                 
    if ($content[$i] -notmatch "!$") {
        $content[$i]
    }
}

Или вот так строкой:

$content = get-content $filepath
$results = [regex]::Matches($content, "($searchtext.*)!").groups[1].value

Но в данном случае вывод превращается в мешанину

→ Ссылка