Командлет 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 или нет.
Однако, при использовании параметра -Include есть некоторые различия.
Если мы введем следующую команду
Get-ChildItem -Path C:\rootfolder -Include *
то получим точно такие же результаты, как и в двух предыдущих случаях. То есть логика работы команды не изменится — командлет получает объект папки C:\rootfolder и перечисляет все его дочерние элементы. А так как значение параметра -Include равняется «*«, то каждый из полученных элементов будет соответствовать заданному критерию фильтрации.
Но если мы попробуем указать в параметре -Include нечто более конкретное, например *.ps1, то у нас ничего не выйдет.
Почему? Просто при использовании параметра -Include, на соответствие заданному критерию фильтрации проверяются все элементы, включая папку, указанную в параметре -Path.
Поэтому, для того, чтобы получить список файлов с расширением ps1, расположенных в папке rootfolder, в качестве фильтра нам потребуется указать rootfolder,*.ps1.
А чтобы получить все элементы папки rootfolder не используя -Include *, мы можем, например, задать следующую команду:
Get-ChildItem -Path C:\rootfolder -Include rootfolder,folder1,folder2,*.ps1,*.xml
Здесь есть одна особенность — использование параметра -Include , без указания символа «» в конце значения параметра -Path не работает в корне диска.
Например, если мы попробуем получить информацию о файле file.ps1, находящемся в корне диска (естественно, сначала нам потребуется его создать: New-Item -ItemType File -Path c:\file.ps1), с использованием следующей команды
Get-ChildItem -Path C:\ -Include file.ps1
то мы не получим никакой информации.
В данном случае это вполне закономерно, так как в соответствии с предыдущими примерами нам нужно внести в фильтр и родительскую папку, которой в нашем случае является диск C.
Но даже если мы введем команду с параметром -Include *, это не даст никаких результатов.
Таким образом, для получения информации об объектах в корне диска следует использовать следующий вариант команды:
Get-ChildItem -Path C:\* -Include file.ps1
Также можно использовать параметр -Filter командлетов Get-ChildItem и Get-Item, но об этом позже.
Давайте более подробно рассмотрим вариант, с указанием «*» в конце значения -Path.
Если мы введем команду:
Get-ChildItem -Path c:\rootfolder\* -Include *
мы получим следующий результат:
Что тут происходит?
Логика работы этой команды заключается в следующем: команда получает все дочерние объекты папки rootfolder, в случае если это файл — информация о нем вводится в списке результатов, в случае же если это папка — команда получает все ее дочерние элементы.
То есть, в данном случае мы получили два файла, расположенных в папке rootfolder (нижний блок информации), и список дочерних объектов двух папок, находящихся в папке rootfolder — folder1 и folder2.
Теперь давайте рассмотрим более конкретные условия фильтрации.
Введем следующую команду:
Get-ChildItem -Path C:\rootfolder\* -Include *.ps1
В качестве результатов мы получим информацию только об одном файле — file.ps1, находящемся в папке rootfolder.
В данному случае происходит следующее: команда получает список всех дочерних объектов папки rootfolder, как это задано в параметре -Path и начинает их обрабатывать, а именно, сравнивать с условием фильтрации, и так как значение параметра -Include в нашем случае — *.ps1, то получается что из всех дочерних объектов папки rootfolder — folder1, folder2, file.xml, file.ps1 — условию удовлетворяет только файл — file.ps1. И именно потому, что папки folder1 и folder2 не соответствуют условию фильтрации, команда даже не пытается получить их содержимое, что она делала в предыдущем примере.
Если мы введем команду:
Get-ChildItem -Path C:\rootfolder\* -Include folder1,*.ps1
мы получим следующие результаты:
В этом случае команда так же получает список дочерних объектов папки 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
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell