Есть ли способ отображения строк текста, который соответствует условию с PowerShell - PullRequest
1 голос
/ 06 июня 2019
$data = Select-String -Path $selectedDirectory\$sqlFile -Pattern "GRANT" -Context 5,5

Я хочу использовать PowerShell для чтения файлов .SQL, и мы хотим убедиться, что пользователь не использует GRANT, DROP или DELETE, пока человек не проверит файл, чтобы убедиться, что он в порядке.

Моя 1-я строка только смотрит на GRANT, но я не думаю, что она работает.

Если в файле есть ключевые слова, я хочу отобразить часть текста на экране +/- 5 строкгде был найден оскорбительный текст.

Есть ли способ изменить цвет текста для конкретной строки, для которой задан критерий поиска (все остальные строки будут показаны по умолчанию)

Ответы [ 4 ]

3 голосов
/ 06 июня 2019

Если вы хотите, чтобы цвета отображались на консоли, вам нужно использовать Write-Host.

$data = Select-String -Path $selectedDirectory\$sqlFile -Pattern "GRANT|DROP|DELETE" -Context 5,5
$data | Foreach-Object {
    $_.Context.Precontext
    Write-Host $_.Line -ForeGroundColor Cyan
    $_.Context.Postcontext
}
1 голос
/ 06 июня 2019

Я попробую.

Эта функция берет файл, ищет эти ключевые слова и затем печатает +/- 5 строк.Это достаточно просто, я уверен, что вы знаете, как это работает и как его изменить.Вы можете найти ссылку на класс matchinfo (возвращаемый Select-String ( здесь .

Function Get-SQLForbiddenWords ($sqlDataFile) {
    $data =  Select-String -Path $sqlDataFile -Pattern "GRANT|DROP|DELETE" 
    Foreach ( $line in $data) {
        $lineNumberS = $line.LineNumber - 5
        $lineNumberE = $line.LineNumber + 5
        echo ('Bad Command Detected: {0}' -f $line.line)
        (Get-Content $sqlDataFile)[$lineNumberS..$lineNumberE]
        echo "`n"
    }
}

. Это было довольно забавно. Вывод:

Bad Command Detected: DROP
this is the sixth line 
GRANT
this is the seventh line
this is the eighth line
DROP
this is the ninth line 
this is the tenth linet
this is the eleventh line 
this is the twelfbthfbth line 
0 голосов
/ 07 июня 2019

Другой способ - использовать функцию oss (= Out-String -Stream).

Select-String "\b(GRANT|DROP|DELETE)\b" .\test.txt -Context 5 | oss | foreach { Write-Host $_ -ForegroundColor ("White","Cyan")[$_[0] -eq '>'] }

Следующее может сделать его более читабельным.

Select-String "\b(GRANT|DROP|DELETE)\b" .\test.txt -Context 5 | Out-String -Stream | foreach {
    if(-not $_) { return }
    $fileName,$lineNumber,$line = $_.Split(":", 3)
    $color = if($_.StartsWith(">")) { "Cyan" } else { "White" }
    Write-Host $fileName $lineNumber.PadLeft(3, "0") $line -ForegroundColor $color -Separator "  "
}
0 голосов
/ 06 июня 2019

Для начала, "GRANT" должно быть в кавычках для обозначения строки.

Если вы заметите, $line = Select-String -Pattern "Grant" вернет объект.

Если вы посмотрите на свойства объекта, используя Get-Member, одно из них будет LineNumber

Если вы прочитали содержимое вашего файла, используя $data = Get-Content File.sql или что-то похожее, ваши данные будут храниться в виде массива. Теперь вы можете использовать этот номер строки для извлечения +/- 5 строк по вашему желанию $data[50..60]. Это покажет выходные строки от 50-й до 60-й строки. Вы можете легко заменить 50 и 60 вашими переменными.

enter image description here

...