Парсинг файла конфигурации 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 шт):
Если необходим вывод строк в виде массива, то можно попробовать так:
$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
Но в данном случае вывод превращается в мешанину