Чувствительный поиск слов с powershell - PullRequest
0 голосов
/ 12 июня 2019

Я немного новичок в PowerShell, поэтому любая помощь будет полезна. Я пытаюсь собрать сценарий PS вместе, чтобы я мог найти в файле важные слова, прежде чем перенести его из одной сети в другую. Например, «Классифицированные» и несколько других слов, которые я могу добавить в банк слов в текстовом файле, и обновлять код каждый раз

Сейчас я вынужден использовать PS 2 Windows 7 и сервер 2008

Select-String -Path e:\transfer_folder\*.* -pattern Classified,restricted

Тогда я могу получить выходные данные для любых совпадений в списке слов, чтобы найти их. Я пытаюсь ускорить мой поиск по сотням страниц документов, используя то, что я люблю называть «грязным поиском слов», чтобы не помещать то, что не должно попадать в неправильную сеть.

1 Ответ

2 голосов
/ 13 июня 2019

У вас правильная идея. Тэкс -Pattern в powershell обычно можно вызывать для работы с регулярными выражениями. Если вы никогда не работали с регулярными выражениями, посмотрите это руководство для начинающих по использованию сопоставления с регулярным выражением . То, что вы, вероятно, хотите, это набор переменных, которые вы можете использовать для динамического выбора этих чувствительных ключевых слов.

Короткий и простой ответ заключается в том, что вы хотите использовать канал, чтобы отделить параметры для шаблона, и передать его в виде строки.

Select-String -Path e:\transfer_folder\*.* -pattern "Classified|Restricted"

Кроме того, вы можете подумать о том, чтобы сделать это на уровне файлов, а не просто импортировать все свои вещи в виде willynilly. Я хотел бы пойти на что-то вроде:

$files = @(Get-ChildItem -Path E:\transfer_folder\ -Filter "*.txt|*.etc").FullName

(Символ @ означает, что вы получаете выходные данные в виде массива. .FullName означает, что вы выбираете только поле FullName из объекта, создаваемого командой.)

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

Foreach ($file in $files) {
   Write-Host "Processing $file"
   echo (Select-String -Path $file -Pattern $pattern) 
}

Одна из причин, по которой я люблю powershell, заключается в том, насколько легко выполнять эти типы операций сопоставления. Если вы покопаетесь в Regex, вы заметите, что можете представлять «ИЛИ» как «|». Таким образом, у вас есть два варианта сделать это логически:

  1. Просто тяжело выпиши

$pattern = "Classified|Forbidden|Death|Danger"

  1. Делать это динамически

Сценарии - это не необходимость делать что-то более одного раза, верно? Так что вы, вероятно, захотите инкапсулировать это в функцию или что-то в этом роде. Или, может быть, вы хотите получить свои слова из текстового файла? Вы можете быть как: (может потребоваться некоторая настройка)

function Get-ForbiddenWords ([string[]]$words, [string]$folder) {
   ForEach ($word in $words) {
      $pattern += "$word|" 
    }
    #remove trailing pipe
    $pattern -replace ".$"
    $files = @(Get-ChildItem -Path $folder -Filter "*.txt|*.etc").FullName
    Foreach ($file in $files) {
       Write-Host "Processing $file"
       echo (Select-String -Path $file -Pattern $pattern) 
    }
}

Теперь вы можете поместить это в свой профиль powershell и вызвать его с помощью

Get-ForbiddenWords -words secret dangerous whatever -folder E:\transfer_folder\

...