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

В этой статье мы продолжим рассматривать варианты применения параметра -Filter, в частности, уделим внимание некоторым его особенностям.

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

В предыдущей статье мы познакомились с некоторыми возможностями параметра -Filter, здесь мы рассмотрим еще несколько вариантов его применения.

Однако, с точки зрения практической ценности, я не думаю, что эти варианты могут где-то пригодиться (кроме, возможно, первого), поэтому стоит рассматривать эту статью как одну из попыток ответить на извечный вопрос «А что, если…?».

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

Get-ChildItem -Path C:\rootfolder\* -Filter folder1\

или

Get-ChildItem -Path C:\rootfolder\* -Filter folder1\*

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

35

Итак, мы получили сообщение об отсутствии папки sub1 в папке rootfolder, и информацию о двух файлах, находящихся в c:\rootfolderfile.ps1 и file.xml.

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

Если путь в значении параметра -Path оканчивается звездочкой, как, например, в нашем случае, а значение параметра -Filter содержит имя каталога, после которого указаны символы «\» или «*«, то команда выводит список элементов папки, указанной в параметре -Path, но только тех, что присутствуют в папке, указанной в параметре -Filter.

То есть, запустив вышеприведенную команду, мы получили информацию о файлах file.ps1 и file.xml из папки c:\rootfolder, потому что они также присутствуют в папке c:\rootfolder\folder1. Кроме того, мы получили сообщение об ошибке «Could not find item C:\rootfolder\sub1«. Это объясняется тем, что каталог sub1 присутствует в папке folder1, поэтому командлет пытается его найти и в папке rootfolder. Если бы каталог sub1 присутствовал в папке rootfolder, то мы бы получили информацию и о нем.

Дальше все становится еще интереснее.

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

Get-ChildItem -Path C:\rootfolder\*\sub1 -Filter filter\

то есть, в значении параметра -Filter мы укажем имя каталога, к которому добавлены символы «\» или «*«, а в значении параметра -Path один из уровней структуры каталогов представим символом «*«, мы получим следующее сообщение об ошибке:

36

То есть, команда пытается найти каталог filter в папке c:\rootfolder\

Если мы добавим его в каталог rootfolder

New-Item -ItemType Directory -Path C:\rootfolder\filter

то запустив еще раз команду

Get-ChildItem -Path C:\rootfolder\*\sub1 -Filter filter\

получим следующее:

37

То есть теперь команда ищет каталог filter в каждом из каталогов, представленных символом «*«.

Создадим эти каталоги.

New-Item -ItemType Directory -Path C:\rootfolder\folder1\filter

New-Item -ItemType Directory -Path C:\rootfolder\folder2\filter

Еще раз запустив команду

Get-ChildItem -Path C:\rootfolder\*\sub1 -Filter filter\

мы получим следующее:

38

То есть, никаких ошибок, никаких результатов. Будем считать, что мы подготовили все необходимое для тестирования работы нашей команды.

Теперь, если мы создадим в каталогах C:\rootfolder\folder1\filter и C:\rootfolder\folder2\filter папки sub1

New-Item -ItemType Directory -Path C:\rootfolder\folder1\filter\sub1

New-Item -ItemType Directory -Path C:\rootfolder\folder2\filter\sub1

то все начнет проясняться.

Запустим команду

Get-ChildItem -Path C:\rootfolder\*\sub1 -Filter filter\

еще раз.

39

Как вы помните, команда Get-ChildItem -Path C:\rootfolder*\sub1 без указания фильтра выведет нам информацию только о папках sub1, находящихся в указанной структуре папок (C:\rootfolder*\).

Таким образом, команда Get-ChildItem -Path C:\rootfolder*\sub1 -Filter filter\ выводит нам результаты запроса «Get-ChildItem -Path C:\rootfolder*\sub1«, но только те, что присутствуют в папке C:\rootfolder*\filter.

Хотя все-таки остается неясным, для чего команде потребовалась папка c:\rootfolder\filter.

Теперь давайте удалим все папки, созданные нами в этой статье:

Remove-Item -Path C:\rootfolder\filter

Remove-Item -Path C:\rootfolder\folder1\filter -Recurse

Remove-Item -Path C:\rootfolder\folder2\filter -Recurse

и рассмотрим команду:

Get-ChildItem -Path C:\rootfolder\*\sub1\* -Filter filter\

Запуск команды выдаст нам следующее:

40

Эта команда также требует наличия папки filter в каталоге c:\rootfolder.

Создадим этот каталог:

New-Item -ItemType Directory -Path C:\rootfolder\filter

Повторный запуск команды возвратит следующее:

41

То есть, в отличие от предыдущего примера, эта команда ищет папки filter не в каталогах c:\rootfolder\folder1 или c:\rootfolder\folder2, а в каталогах c:\rootfolder*\sub1.

Создадим эти каталоги.

New-Item -ItemType Directory -Path C:\rootfolder\folder1\sub1\filter

New-Item -ItemType Directory -Path C:\rootfolder\folder2\sub1\filter

Еще раз запустим команду

Get-ChildItem -Path C:\rootfolder\*\sub1\* -Filter filter\

42

Теперь команда отработает без ошибок, как впрочем и без результатов.

Если мы сейчас создадим в каталогах C:\rootfolder\folder1\sub1\filter и C:\rootfolder\folder2\sub1\filter\ файлы file.ps1 и file.xml:

New-Item -ItemType File -Path C:\rootfolder\folder1\sub1\filter\file.ps1

New-Item -ItemType File -Path C:\rootfolder\folder1\sub1\filter\file.xml

New-Item -ItemType File -Path C:\rootfolder\folder2\sub1\filter\file.ps1

New-Item -ItemType File -Path C:\rootfolder\folder2\sub1\filter\file.xml

то, запустив еще раз команду

Get-ChildItem -Path C:\rootfolder\*\sub1\* -Filter filter\

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

43

То есть, команда выводит содержимое каталогов C:\rootfolder\folder1\sub1 и C:\rootfolder\folder2\sub1, но только то, что присутствует в каталогах C:\rootfolder\folder1\sub1\filter и C:\rootfolder\folder2\sub1\filter соответственно.

Если мы добавим в каждую из папок C:\rootfolder\folder1\sub1\filter и C:\rootfolder\folder2\sub1\filter каталог sub2:

New-Item -ItemType Directory -Path C:\rootfolder\folder1\sub1\filter\sub2

New-Item -ItemType Directory -Path C:\rootfolder\folder2\sub1\filter\sub2

то команда

Get-ChildItem -Path C:\rootfolder\*\sub1\* -Filter filter\

вернет информацию также и о папках:

44

Однако, если в каталогах filter будет присутствовать файл или папка, которого нет в каталогах  C:\rootfolder\folder1\sub1 или  C:\rootfolder\folder2\sub1, то в дополнение к результатам, команда выведет сообщение об ошибке.

Давайте создадим в каталогах C:\rootfolder\folder1\sub1\filter и C:\rootfolder\folder2\sub1\filter файл file.log:

New-Item -ItemType File -Path C:\rootfolder\folder1\sub1\filter -Name file.log

New-Item -ItemType File -Path C:\rootfolder\folder2\sub1\filter -Name file.log

и еще раз запустим команду:

Get-ChildItem -Path C:\rootfolder\*\sub1\* -Filter filter\

45

Как вы видите, сообщение об ошибке говорит о том, что команда не может найти файлы file.log в папках C:\rootfolder\folder1\sub1 и C:\rootfolder\folder2\sub1.


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

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. Выход /  Изменить )

w

Connecting to %s