Возможности фильтрации командлета Get-ChildItem. Часть 1.

Командлет Get-ChildItem используется для получения дочерних элементов указанного объекта. Кроме обычного вывода всех существующих дочерних объектов, мы можем воспользоваться некоторыми возможностями фильтрации, которые представлены параметрами -Include, -Exclude и -Filter. Их мы и рассмотрим.

Это вторая часть серии.
Остальные статьи:
Возможности фильтрации командлета Get-ChildItem. Часть 2.
Возможности фильтрации командлета Get-ChildItem. Часть 3.

Для начала давайте создадим некоторое тестовое окружение, а именно набор вложенных папок и файлов.

Создадим следующую структуру:

c:\rootfolder
c:\rootfolder\file.ps1
c:\rootfolder\file.xml

c:\rootfolder\folder1
c:\rootfolder\folder1\file.ps1
c:\rootfolder\folder1\file.xml

c:\rootfolder\folder1\sub1
c:\rootfolder\folder1\sub1\file.ps1
c:\rootfolder\folder1\sub1\file.xml

c:\rootfolder\folder1\sub1\sub2
c:\rootfolder\folder1\sub1\sub2\file.ps1
c:\rootfolder\folder1\sub1\sub2\file.xml

c:\rootfolder\folder1\sub1\sub2\sub3

c:\rootfolder\folder2
c:\rootfolder\folder2\file.ps1
c:\rootfolder\folder2\file.xml

c:\rootfolder\folder2\sub1
c:\rootfolder\folder2\sub1\file.ps1
c:\rootfolder\folder2\sub1\file.xml

c:\rootfolder\folder2\sub1\sub2
c:\rootfolder\folder2\sub1\sub2\file.ps1
c:\rootfolder\folder2\sub1\sub2\file.xml

c:\rootfolder\folder2\sub1\sub2\sub3

Создадим мы это следующим набором команд:

New-Item -ItemType Directory -Path c:\rootfolder\folder1\sub1\sub2\sub3

New-Item -ItemType File -Path c:\rootfolder\file.ps1
New-Item -ItemType File -Path c:\rootfolder\file.xml

New-Item -ItemType File -Path c:\rootfolder\folder1\file.ps1
New-Item -ItemType File -Path c:\rootfolder\folder1\file.xml

New-Item -ItemType File -Path c:\rootfolder\folder1\sub1\file.ps1
New-Item -ItemType File -Path c:\rootfolder\folder1\sub1\file.xml

New-Item -ItemType File -Path c:\rootfolder\folder1\sub1\sub2\file.ps1
New-Item -ItemType File -Path c:\rootfolder\folder1\sub1\sub2\file.xml

New-Item -ItemType Directory -Path c:\rootfolder\folder2\sub1\sub2\sub3

New-Item -ItemType File -Path c:\rootfolder\folder2\file.ps1
New-Item -ItemType File -Path c:\rootfolder\folder2\file.xml

New-Item -ItemType File -Path c:\rootfolder\folder2\sub1\file.ps1
New-Item -ItemType File -Path c:\rootfolder\folder2\sub1\file.xml

New-Item -ItemType File -Path c:\rootfolder\folder2\sub1\sub2\file.ps1
New-Item -ItemType File -Path c:\rootfolder\folder2\sub1\sub2\file.xml

Теперь перейдем к рассмотрению параметров.

-Include

Как работает командлет Get-ChildItem. Он получает объект, указанный в параметре -Path и выводит список всех его дочерних элементов.

Обычно, команда Get-ChildItem возвращает одинаковый набор результатов, вне зависимости от того, укажем ли мы звездочку в конце значения параметра -Path или нет.

01

02

Однако, при использовании параметра -Include есть некоторые различия.

Если мы введем следующую команду

Get-ChildItem -Path C:\rootfolder -Include *

то получим точно такие же результаты, как и в двух предыдущих случаях. То есть логика работы команды не изменится — командлет получает объект папки C:\rootfolder и перечисляет все его дочерние элементы. А так как значение параметра -Include равняется «*«, то каждый из полученных элементов будет соответствовать заданному критерию фильтрации.

Но если мы попробуем указать в параметре -Include нечто более конкретное, например *.ps1, то у нас ничего не выйдет.

031

Почему? Просто при использовании параметра -Include, на соответствие заданному критерию фильтрации проверяются все элементы, включая папку, указанную в параметре -Path.

Поэтому, для того, чтобы получить список файлов с расширением ps1, расположенных в папке rootfolder, в качестве фильтра нам потребуется указать rootfolder,*.ps1.

032

А чтобы получить все элементы папки rootfolder не используя -Include *, мы можем, например, задать следующую команду:

Get-ChildItem -Path C:\rootfolder -Include rootfolder,folder1,folder2,*.ps1,*.xml

033

Здесь есть одна особенность — использование параметра -Include , без указания символа «» в конце значения параметра -Path не работает в корне диска.

Например, если мы попробуем получить информацию о файле file.ps1, находящемся в корне диска (естественно, сначала нам потребуется его создать: New-Item -ItemType File -Path c:\file.ps1), с использованием следующей команды

Get-ChildItem -Path C:\ -Include file.ps1

то мы не получим никакой информации.

08

В данном случае это вполне закономерно, так как в соответствии с предыдущими примерами нам нужно внести в фильтр и родительскую папку, которой в нашем случае является диск C.

Но даже если мы введем команду с параметром -Include *, это не даст никаких результатов.

09

Таким образом, для получения информации об объектах в корне диска следует использовать следующий вариант команды:

Get-ChildItem -Path C:\* -Include file.ps1

10

Также можно использовать параметр -Filter командлетов Get-ChildItem и Get-Item, но об этом позже.

Давайте более подробно рассмотрим вариант, с указанием «*» в конце значения -Path.

Если мы введем команду:

Get-ChildItem -Path c:\rootfolder\* -Include *

мы получим следующий результат:

04

Что тут происходит?

Логика работы этой команды заключается в следующем: команда получает все дочерние объекты папки rootfolder, в случае если это файл — информация о нем вводится в списке результатов, в случае же если это папка — команда получает все ее дочерние элементы.

То есть, в данном случае мы получили два файла, расположенных в папке rootfolder (нижний блок информации), и список дочерних объектов двух папок, находящихся в папке rootfolderfolder1 и folder2.

Теперь давайте рассмотрим более конкретные условия фильтрации.

Введем следующую команду:

Get-ChildItem -Path C:\rootfolder\* -Include *.ps1

05

В качестве результатов мы получим информацию только об одном файле — file.ps1, находящемся в папке rootfolder.

В данному случае происходит следующее: команда получает список всех дочерних объектов папки rootfolder, как это задано в параметре -Path и начинает их обрабатывать, а именно, сравнивать с условием фильтрации, и так как значение параметра -Include в нашем случае — *.ps1, то получается что из всех дочерних объектов папки rootfolderfolder1, folder2, file.xml, file.ps1 — условию удовлетворяет только файл — file.ps1. И именно потому, что папки folder1 и folder2 не соответствуют условию фильтрации, команда даже не пытается получить их содержимое, что она делала в предыдущем примере.

Если мы введем команду:

Get-ChildItem -Path C:\rootfolder\* -Include folder1,*.ps1

мы получим следующие результаты:

06

В этом случае команда так же получает список дочерних объектов папки rootfolder и сравнивает их со значением фильтра. Сначала сравнивается папка folder1, и так как она удовлетворяет условию фильтрации, происходит получение ее дочерних объектов. Теперь уже ее дочерние объекты сравниваются с условием фильтрации. Папка folder1 содержит следующие элементы: sub1, file.ps1,file.xml, из которых только file.ps1 удовлетворяет условию фильтрации, следовательно обработка папки folder1 заканчивается и этот файл появляется в списке результатов. Далее команда обрабатывает папку folder2. Так как она не удовлетворяет условию фильтрации, получения ее дочерних элементов не происходит. Далее обрабатывается файл file.ps1, он удовлетворяет условию фильтрации, соответственно информация о нем выводится в списке результатов. Последним обрабатывается файл file.xml. Он не соответствует условию фильтрации, так что информация о нем не выводится.

Соответствуя логике команды, для того, чтобы явным образом указать все необходимые условия фильтрации без использования -Include *, нам потребуется ввести следующую команду:

Get-ChildItem -Path C:\rootfolder\* -Include folder1,folder2,sub1,*.ps1,*.xml

07


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s