Для поиска файлов через Powershell есть командлет ChildItem. С помощью него мы можем фильтровать данные. Например так мы выведем все файлы и папки, которые лежат на диске C.
Get-ChildItem -Path "C:\" -Recurse
Где:
- Path - где искать. Если его не указать, то powershell будет искать там файлы, откуда он и запущен. Через запятую можно указать несколько директорий.
- Recurse - рекурсивный поиск. Когда этот ключ не установлен, показываются файлы только текущей папки. Когда этот установлен, показываются, в том числе, папки и файлы внутри других папок.
Если у нас ожидаются папки, к которым у нас нет доступа, то мы можем добавить ключ -ErrorAction, что бы процесс поиска не останавливался с ошибкой:
Get-ChildItem -Path "C:\Windows\" -Recurse -ErrorAction SilentlyContinue
Для поиска нужных элементов у нас есть два ключа: для включения параметра и исключения. Например я знаю точно, что у программы "Калькулятор" файл имеет в названии calc, а расширение exe. При этом не уверен находится ли он в папке Windows или Program Files и включу оба пути. Так же я хочу исключить файлы с расширением msi и словом win:
Get-ChildItem -Path C:\Windows\,C:\Program Files\ -Include "*calc*.exe" -Exclude "*.msi","win*" -Recurse -Force -ErrorAction SilentlyContinue
Где:
- Include нужен для поиска вхождения. Знак * говорит, что я не знаю с чего начинается имя файла, но в нем есть calc, я не знаю что идет после, но заканчивается на .exe . Например под эти результаты подходят 1111calc1111.exe или AbcAlc2.exe.
- Exclude говорит, что мне не нужно, т.е. исключит из выдачи. Это файлы заканчивающиеся на .msi и начинающиеся на win.
- Force этот ключ позволяет искать в скрытых файлах и папках
Если мы используем Include и не используем Recurse, то знак * обязателен в Path иначе результат будет пустой.
Поиск файлов через Powershell по дате
Теперь попробуем найти файлы, которые были созданы за последнюю неделю. Для этого, сначала, объявим переменную с датой:
$date = Get-Date -Year 2019 -Month 6 -Day 22 -Hour 1 -Minute 00
Не обязательно все заполнять, но в таком случае значения будут приняты по умолчанию (от текущего дня).
Затем передадим эти значения в наш поиск:
Get-ChildItem -Path "C:\" -Include "*.txt" -Exclude "*.rar" -Recurse | Where-Object {$_.LastWriteTime -ge $date}
Где:
- | это конвейер или Pipline, он говорит о том, что к каждому объекту слева нужно применить действия справа
- Where-Object {$_.LastWriteTime - говорит о том, что нужно применять только к тем объектам, где есть значение LastWriteTime (последнее время изменения).
- -ge $date - значит, что объект должен быть больше или равен (Greater than or equal) нашей переменной с датой. Если бы мы хотели узнать до определенной даты, мы должны были бы указать -le $date, -eq если бы дата была бы ровна. Называется "Операторы сравнения"
Поиск по содержимому файлов через Powershell
Мы можем искать внутри файлов, т.е. вхождение строк:
Get-ChildItem -Path C:\Folder1\ -Include "*.txt" -Recurse | Select-String -SimpleMatch "fixmypc"
Где:
- SimpleMatch - строка, которую мы хотим найти внутри файла
В случае выше, для всего что слева от pipeline | , будет идти поиск внутри файлов на упоминание строки fixmypc.
Командлет Select-String может использоваться для поиска файлов:
Select-String -Path C:\Folder1\* -SimpleMatch "fixmypc" -Include "*.txt" -Exclude "*.rar"
Разница в том, что он будет искать только в текущей папке, а не во вложенных. Он так же будет искать вхождение в каждом файле, что при большом объеме существенно увеличит время работы. Т.е. эта команда предназначена уже для отфильтрованных значений, например после Get-ChildItem.
Но в Select-String есть дополнительные ключи, которые могут быть полезны. Вот часть из них:
- CaseSensitive - в обычных командлетах и сравнениях Powershell "а" и "А" одинаковые буквы. Если поставить этот ключ, то они станут разными
- Pattern - если с ключом SimpleMatch мы можем найти конкретную строку (нельзя использовать * звездочку), то с этим ключом мы можем использовать регулярные выражения.
...
Подписывайтесь на наш Telegram канал
Теги: #powershell