В Powershell есть командлет, похожий на grep в Linux, Select-String. С помощью него мы можем искать как файлы, так и вхождения строк и, по желанию, используя регулярные выражения.
Для поиска внутри файла можно выполнить следующий командлет:
Select-String -Path *.txt -Pattern "fix"
Где:
- Path - путь до директории или документа. В моем случае будут искаться все файлы с расширением .txt, т.к. знак * говорит что мы не знаем что находится слева. Если путь не указан, то он используется по умолчанию, откуда запущен powershell.
- Pattern - строка, которую мы ищем внутри файла. Этот ключ используется для регулярных выражений. Для использования простого поиска, без регулярки, нужно ставить -SimpleMatch
Мы можем искать не только в файлах, но и в самих строках:
$str = "Hello World"
Select-String -InputObject $str -SimpleMatch "hello","idk"
Где:
- InputObject - объект, в котором мы будем искать переменную
- SimpleMatch - простое совпадение. В моем случае их два. Если "hello" или "idk" будет в строке, то команда вернет строку.
Если мы используем путь в какую-то папку, то мы можем включать и исключать какие-то свойства:
$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:
Get-ChildItem -Path 'C:\Folder1\' -Recurse -Exclude "*.mp3" | Select-String -SimpleMatch "fix"
Где:
- Recurse - рекурсивный поиск т.е. поиск по всем папкам включительно.
- Exclude - исключаем файлы с расширением mp3
Если в папке много файлов, то конечно быстрее будет сначала отфильтровать файлы через powershell Get-ChildItem, а затем искать в них нужные строки через Select-String.
С помощью такой команды мы можем исключить файлы, к которым у нас нет доступа иначе может быть ошибка:
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
...
Подписывайтесь на наш Telegram канал
Теги: #powershell