Поиск текстового шаблона с распечаткой строки - PullRequest
0 голосов
/ 24 октября 2019

Я сетевой инженер, и я написал небольшой, но эффективный PS-скрипт для поиска в журналах (или любом другом файле) текстовых шаблонов. Теперь этот скрипт выводит только строку, имя файла и так далее. Теперь я хотел расширить скрипт так, чтобы при обнаружении строки он сообщал мне строку, имя файла и т. Д., А также содержимое этой строки.

Таким образом, это должно выглядеть следующим образом:

LineNumber Filename            Path                           Pattern                                  
---------- --------            ----                           -------                                  
4          190719_Success.log  C:\skripte\190719_Success.log  test 

Текст, который находится в строке 4 журнала, должен отображаться здесь

5          190719_Success.log  C:\skripte\190719_Success.log  test  

Текст, который находится в строке 5 .log, должен появиться здесь

Извините за форматирование, я надеюсь, вы понимаете, о чем я.

Поскольку я относительно новичок в PSСценарии Я вроде как потерял, как мне достичь этой цели или, если это вообще возможно.

Вот мой код софта:

Clear-Host
$Pfad = Read-Host "Bitte Pfad angeben" #Enter Directory Path to Search
$Suchbegriff = Read-Host "Suchbegriff eingeben" #Enter Pattern to search for
New-Item -ItemType directory -Path C:\Skripte -erroraction 'silentlycontinue' #create C:\Skripte Folder
Remove-Item -Path C:\Skripte\Suchergebnis.txt -erroraction 'silentlycontinue' #Cleanup from previous run
Remove-Item -Path C:\Skripte\Indizierung.csv -erroraction 'silentlycontinue' #Cleanup
cd $Pfad 

echo $file.fullname
echo ""
select-string -Path .\*.* -Pattern "$Suchbegriff" -erroraction 'silentlycontinue' | Select-Object LineNumber,Filename,Path,Pattern | ft -wrap #Search the specified Directory
echo ""

while(($Create = Read-Host -Prompt "Unterordner durchsuchen? J für Ja, N für Nein") -ne "x") #Userinput if Subdirectorys should be searched aswell
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     {
 switch ($Create)

{
        'J' 
{
Get-Childitem  -erroraction 'silentlycontinue' | Get-ChildItem -Recurse -erroraction 'silentlycontinue' | Where-Object {$_.PSIsContainer} | Export-CSV -NoClobber -NoTypeInformation -Path C:\Skripte\Indizierung.csv #Get all Subdirectorys and put them in a CSV, two GCI are needed to reliably get all subdirectories.
$Files = import-csv -Delimiter ',' -Path C:\Skripte\Indizierung.csv #Import CSV
foreach ($File in $Files)
{
cd $file.fullname
echo $file.fullname
echo ""
select-string -Path .\*.* -Pattern "$Suchbegriff" -erroraction 'silentlycontinue' | Select-Object LineNumber,Filename,Path,Pattern | ft -wrap
echo ""
pause
exit
} 
}
        'n'
{
pause
Exit
}       
}
}

1 Ответ

0 голосов
/ 24 октября 2019

Посмотрите на следующий код. Я добавил цикл для обработки файлов и некоторую проверку ввода + ваш запрос на вывод содержимого строки на консоль.

Код адаптирован (@Theo: спасибо за ввод)

#Get input
[System.String]$SearchPath = Read-Host -Prompt 'Enter path'
[System.String]$SearchPattern = Read-Host -Prompt 'Enter search pattern'
[System.String]$SearchRecurse = Read-Host -Prompt 'Search recurse (Y/N)'

#Validate input
if ((-not $SearchPath) -or (-not (Test-Path -Path $SearchPath)))
{
    throw ('Path "' + $SearchPath + 'is not available!')
}

if ((-not $SearchPattern))
{
    throw ('Search pattern is empty!')
}

if (('Y', 'N') -notcontains $SearchRecurse)
{
    throw ('Search recurse parameter "' + $SearchRecurse + ' is not valid!')
}

#Get all files
Out-Host -InputObject 'Get all files...'
[PSCustomObject[]]$Files = @()
if ($SearchRecurse -eq 'Y')
{
    $Files = Get-ChildItem -Path $SearchPath -File -Recurse -Force #Collect also files from subfolders
}
else
{
    $Files = Get-ChildItem -Path $SearchPath -File -Force #Collect only files from the current folder
}

#Search for string
Out-Host -InputObject 'Search for string...'
[PSCustomObject[]]$Output = @()
foreach ($File in ($Files)) #Process each file
{
    Out-Host -InputObject $File.FullName
    $Output += Select-String -Path $File.FullName -Pattern $SearchPattern | Select-Object -Property LineNumber, Filename, Path, Pattern, Line
}

$Output | Format-Table -Wrap
...