Как искать файлы используя Powershell Get-ChildItem


02 июля 2019


Поиск файлов через Powershell

Для поиска файлов через Powershell есть командлет ChildItem. С помощью него мы можем фильтровать данные. Например так мы выведем все файлы и папки, которые лежат на диске C.

Get-ChildItem -Path "C:\" -Recurse

Где:

  • Path - где искать. Если его не указать, то powershell будет искать там файлы, откуда он и запущен. Через запятую можно указать несколько директорий.
  • Recurse - рекурсивный поиск. Когда этот ключ не установлен, показываются файлы только текущей папки. Когда этот установлен, показываются, в том числе, папки и файлы внутри других папок.

Поиск файлов Powershell

Если у нас ожидаются папки, к которым у нас нет доступа, то мы можем добавить ключ -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

Не обязательно все заполнять, но в таком случае значения будут приняты по умолчанию (от текущего дня).

powershell Get-Date

Затем передадим эти значения в наш поиск:

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 мы можем найти конкретную строку (нельзя использовать * звездочку), то с этим ключом мы можем использовать регулярные выражения.
...

Теги: #powershell


Популярные тэги
Каналы
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.