$data = Select-String -Path $selectedDirectory\$sqlFile -Pattern "GRANT" -Context 5,5
Я хочу использовать PowerShell для чтения файлов .SQL, и мы хотим убедиться, что пользователь не использует GRANT, DROP или DELETE, пока человек не проверит файл, чтобы убедиться, что он в порядке.
Моя 1-я строка смотрит только на GRANT, но я не думаю, что она работает.
Если ключевые слова находятся в файле, я хочу отобразить часть текста на экране +/- 5 строк того места, где был найден оскорбительный текст.
Есть ли способ изменить цвет текста для конкретной строки с неверными критериями поиска (все остальные строки будут отображаться по умолчанию)
я понял это потом.
Параметр Select-String
-Pattern
использует регулярное выражение. Вы можете найти все вхождения этих ключевых слов, используя -Pattern "GRANT|DROP|DELETE"
Write-Host
может выводить с использованием цвета, но обычно это не рекомендуется, поскольку его нельзя перенаправить.
Я думаю, что OP беспокоится только об интерактивном выводе на терминал, поэтому перенаправление не является проблемой.
Это может быть так, но важно сделать оговорку.
Во-первых, "GRANT"
должен быть в кавычках для обозначения строки.
Если вы заметили, $line = Select-String -Pattern "Grant"
вернет объект.
Если вы посмотрите на свойства объекта с помощью Get-Member
, одно из них LineNumber
Если вы прочитали содержимое своего файла с помощью $data = Get-Content File.sql
или чего-то подобного, ваши данные будут в виде объекта массива. Теперь вы можете использовать этот номер строки для извлечения строк +/- 5
по своему усмотрению, например $data[50..60]
. Это покажет выходные строки с 50-й по 60-ю строку. Вы можете легко заменить 50 и 60 своими переменными.
Но параметр -Context 5,5
уже заботится о строках до и после.
Если вы хотите, чтобы цвета отображались на консоли, вам нужно будет использовать 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
}
Я попробую.
Эта функция берет файл, ищет эти ключевые слова, а затем печатает +/- 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
Хотя это, вероятно, сработает, Select-String
уже предоставляет возможность -Context
получать линии до и после. Ответ @AdminOfThings использует это для получения аналогичного результата с меньшими усилиями.
Другой способ — использовать функцию 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 " "
}
Во-первых,
"GRANT"
должен быть в кавычках для обозначения строки.