Как искать в Powershell используя Select-String
В Powershell есть командлет, похожий на grep в Linux, Select-String. С помощью него мы можем искать как файлы, так и вхождения строк и, по желанию, используя регулярные выражения.
Для поиска внутри файла можно выполнить следующий командлет:
1
|
Select-String -Path *.txt -Pattern "fix"
|
Где:
- Path — путь до директории или документа. В моем случае будут искаться все файлы с расширением .txt, т.к. знак * говорит что мы не знаем что находится слева. Если путь не указан, то он используется по умолчанию, откуда запущен powershell.
- Pattern — строка, которую мы ищем внутри файла. Этот ключ используется для регулярных выражений. Для использования простого поиска, без регулярки, нужно ставить -SimpleMatch

Мы можем искать не только в файлах, но и в самих строках:
1
2
|
$str = "Hello World"
Select-String -InputObject $str -SimpleMatch "hello","idk"
|
Где:
- InputObject — объект, в котором мы будем искать переменную
- SimpleMatch — простое совпадение. В моем случае их два. Если «hello» или «idk» будет в строке, то команда вернет строку.
Если мы используем путь в какую-то папку, то мы можем включать и исключать какие-то свойства:
1
2
|
$path = "C:\Folder1\New folder\*"
Select-String -Path $path -SimpleMatch "fix" -Include "*.txt" -Exclude "text*" -CaseSensitive
|
Где:
- $path — переменная с путем, которая включает все файлы в папке «New Folder».
- Include — включает все файлы. В моем случае с расширением .txt
- Exclude — исключает все файлы, которые начинаются на text.
- CaseSensitive — учет регистра. В powershell, по умолчанию, буква «а» и «А» одинаковые, а с этим ключом они будут разными.
Т.к. командлет ищет только в текущей папке, но мы можем использовать другой, для более глубокого поиска файлов через Powershell:
1
|
Get-ChildItem -Path 'C:\Folder1\' -Recurse -Exclude "*.mp3" | Select-String -SimpleMatch "fix"
|
Где:
- Recurse — рекурсивный поиск т.е. поиск по всем папкам включительно.
- Exclude — исключаем файлы с расширением mp3
Если в папке много файлов, то конечно быстрее будет сначала отфильтровать файлы через powershell Get-ChildItem, а затем искать в них нужные строки через Select-String.
С помощью такой команды мы можем исключить файлы, к которым у нас нет доступа иначе может быть ошибка:
1
|
Get-ChildItem -Path 'C:\Folder1\' -Recurse -Exclude "*.mp3" -ErrorAction SilentlyContinue | Select-String -SimpleMatch "fix" -NotMatch
|
Где:
- NoMatch — говорит, что нам нужны только те строки, где нет «fix» или дословно «Не совпадает»
- ErrorAction — со значением SilentlyContinue — говорит «не уведомлять об ошибках».
Разницу с Nomatch можно увидеть на картинке:

Если файл или строка в другой кодировке, то мы можем указать дополнительный ключ в виде -Encoding. Он может принимать следующие значения:
- ASCII
- BigEndianUnicode
- OEM
- Unicode
- UTF7
- UTF8
- UTF8BOM
- UTF8NoBOM
- UTF32