Если вы пытаетесь найти файл, содержащий определённую строку текста, с помощью PowerShell, вы обратились по адресу.
Я покажу вам, как именно найти то, что вы ищете, с помощью команды Select-String
и простого PowerShell-скрипта.
Как использовать командлет Select-String в PowerShell
Командлет Select-String
используется в PowerShell для поиска текстовых шаблонов.
Обычно его применяют для поиска строк в файлах, но он также может использоваться для поиска строк из других источников.
Простой пример использования Select-String
:
Get-Command | Select-String -Pattern 'Appx' -SimpleMatch
В этом примере мы передаём результаты команды Get-Command
в Select-String
и фильтруем их по шаблону ‘Appx’.
Мы добавляем параметр -SimpleMatch
, чтобы команда не интерпретировала шаблон как регулярное выражение, что по умолчанию делает Select-String
.
В итоге этот пример возвращает все команды PowerShell, в названии которых есть строка ‘Appx’.
Как найти строку текста в файле с помощью PowerShell
Как я упомянул ранее, одной из основных задач команды Select-String
является поиск строк текста в файле.
Начнём с простого примера:
Select-String -Path 'C:\temp\*.csv' -Pattern 'Bart.Simpson' -SimpleMatch
В этом примере мы ищем файлы с шаблоном строки ‘Bart.Simpson’.
В качестве пути мы указываем каталог C:\temp
, специально ищем файлы с расширением .csv
.
Как видно на скриншоте, мы нашли совпадение на строке 4 в файле Usernames.csv
.
Если найдено несколько источников, соответствующих шаблону, команда вернёт каждый из них.
Чтобы продемонстрировать это, я выполню команду снова, но на этот раз добавлю второй файл, содержащий искомый шаблон.
Теперь команда возвращает оба источника, где была найдена строка.
Как искать в подкаталогах строку с помощью PowerShell
Если вы знакомы с PowerShell, вы, вероятно, использовали параметр -Recurse
для поиска в подкаталогах.
Однако команда Select-String
не поддерживает параметр -Recurse
.
Но это не проблема, потому что мы можем использовать Get-ChildItem
с параметром -Recurse
, а затем передать результаты в команду Select-String
.
Пример:
Get-ChildItem -Path 'C:\temp\*.csv' -Recurse | Select-String -Pattern 'Bart.Simpson' -SimpleMatch
В этом примере мы используем команду Get-ChildItem
для определения пути к каталогу и используем параметр -Recurse
, чтобы включить подкаталоги.
Результаты затем передаются в команду Select-String
.
Нам не нужно повторно определять путь, так как он уже был установлен в предыдущей команде.
Этот пример вернул два результата: один в каталоге C:\temp\
и другой в подкаталоге C:\temp\Department Info\Marketing\
.
Как найти дату с помощью Select-String и регулярных выражений в PowerShell
Иногда вы не знаете точные данные, которые ищете.
Возможно, вы знаете только формат данных, которые пытаетесь найти.
В таких случаях на помощь приходят регулярные выражения (regex).
Вот пример, который использует Select-String
и регулярное выражение для поиска строк, соответствующих формату MM/DD/YYYY:
# Устанавливаем шаблон regex для определения формата MM/DD/YYYY и сохраняем его в переменной $dateRegex = '(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}' Select-String -Path 'C:\temp\*.csv' -Pattern $dateRegex
Результаты вернули совпадение с форматом даты в строке 1 файла по пути C:\temp\Patch Tuesday 2024-Aug.csv
.
Найденная строка — дата 08/13/2024.
Обратите внимание, что мы не использовали параметр -SimpleMatch
, чтобы регулярное выражение было правильно интерпретировано.
Как найти строки в журналах событий Windows с помощью Select-String
Ещё один полезный случай использования командлета Select-String
— это поиск определённых строк в журналах событий Windows.
Вот пример того, как искать строку в журналах событий Windows с помощью командлета Select-String
:
$logs = Get-WinEvent -LogName Setup -MaxEvents 50 $logs | Select-String -InputObject {$_.Message} -Pattern 'KB5044020' -SimpleMatch
В этом примере мы получаем 50