В этой статье мы рассмотрим применение параметра -Include в случаях когда параметр -Path содержит символы «*» в середине значения.
Это вторая часть серии.
Остальные статьи:
Возможности фильтрации командлета Get-ChildItem. Часть 1.
Возможности фильтрации командлета Get-ChildItem. Часть 3.
Давайте рассмотрим ситуацию, когда символ «*» находится не в конце, а середине значения параметра -Path.
Например, введя команду:
Get-ChildItem -Path C:\rootfolder\*\sub1
в качестве результата мы получим информацию о папках sub1, расположенных в каталогах C:\rootfolder\folder1 и C:\rootfolder\folder2.
Нужно отметить, что в данном случае не просходит получения дочерних элементов этих папок, а отображается информация только о них самих.
Для того, чтобы получить информацию об их дочерних элементах можно воспользоваться командой
Get-ChildItem -Path C:\rootfolder\*\sub1\*
но об этом чуть позже.
Подобный эффект дает и использование команды
Get-ChildItem -Path C:\rootfolder\*\sub1 -Include *
То есть, данной командой мы получаем информацию о всех дочерних элементах папок sub1, расположенных в каталогах C:\rootfolder\folder1 и C:\rootfolder\folder2.
Таким же образом, как и в примерах предыдущей статьи мы можем воспользоваться определенным значением параметра -Include для того, чтобы получить нужные нам элементы. Однако здесь мы сталкиваемся с некоторым нюансом, а именно: в случае использования символа «» внутри значения параметра -Path, в значении параметра -Include должны указываться имена всех папок в иерархии, начиная с уровня, представленного символом ««, включая имена папок уже указанных в значении параметра -Path.
То есть, для того, чтобы получить информацию о, например, файлах с расширением ps.1, расположенных в папках C:\rootfolder\folder1\sub1 и C:\rootfolder\folder2\sub1, нам нужно ввести следующую команду:
Get-ChildItem -Path C:\rootfolder\*\sub1 -Include folder1,folder2,sub1,*.ps1
Таким образом, в этой команде в качестве значения параметра -Include мы указали обе папки, находящиеся в каталоге rootfolder — folder1,folder2 (если не указать какую-либо из них, информация об файлах и каталогах, входящих в эту папку не будет выведена, что опять же можно использовать для исключения определенных папок ). Кроме того, мы указали папку sub1, находящуюся в каждом из каталогов folder1 и folder2, а также значение «*.ps1«, указывающее расширение нужных нам файлов.
Для того, чтобы, например, вывести все содержимое папок sub1 (включая их подпапки), не используя -Include *, нам потребуется ввести следующую команду:
Get-ChildItem -Path C:\rootfolder\*\sub1 -Include folder1,folder2,sub1,sub2,*.ps1,*.xml
Теперь давайте увеличим количество звездочек.
Как уже говорилось выше, команда
Get-ChildItem -Path C:\rootfolder\*\sub1\*
выводит информацию обо всех дочерних элементах папок sub1.
Если в эту команду добавить параметр -Include *, мы получим список всех файлов папок sub1, а также список всех дочерних элементов папок, расположенных в каталогах sub1.
Get-ChildItem -Path C:\rootfolder\*\sub1\* -Include *
Происходит следующее. Команда получает список папок sub1, расположенных в каждой из иерархий каталогов, соответствующих значению параметра -Path, а именно: c:\rootfolder\folder1\sub1 и c:\rootfolder\folder2\sub1. Далее команда начинает обрабатывать дочерние элементы каждого из этих каталогов. В случае, если это файл — информация о нем включается в результаты выполнения команды, если же это папка — команда получает информацию о всех ее дочерних элементах.
В нашем случае команда начинает просматривать дочерние объекты каталога c:\rootfolder\folder1\sub1, а именно — sub2, file.ps1,file.xml, так как sub2 является каталогом, команда получает и выводит информацию о его дочерних элементах — sub3, file.ps1 и file.xml. Далее команда обрабатывает файлы входящие в каталог c:\rootfolder\folder1\sub1 — file.ps1 и file.xml и выводит их информацию в результатах выполнения.
Точно так же команда обрабатывает каталог c:\rootfolder\folder2\sub1.
Для получения информации, например, о файлах с расширением ps1, находящихся в каталогах c:\rootfolder\folder1\sub1\sub2 и c:\rootfolder\folder2\sub1\sub2 нам потребуется ввести слудеющую команду:
Get-ChildItem -Path C:\rootfolder\*\sub1\* -Include folder1,folder2,sub1,sub2,*.ps1
Здесь в качестве значения параметра -Include мы опять указываем имена всех папок в иерархии, начиная с самого первого уровня, представленного символом ««, а именно — folder1, folder2, sub1 и sub2. Для того, чтобы вывести только файлы с расширением ps1, мы добавляем значение «.ps1«.
И давайте в очерендной раз попробуем задать команду, эквивалентную использованию параметра -Include *.
Нам нужно указать имена всех папок в иерархии, начиная с самого первого уровня, представленного звездочкой — folder1, folder2, sub1 и sub2, всех папок, входящих в каталоги, на которые указывает значение параметра -Path — sub3 и некоторое обозначение входящих в них файлов, в нашем случае это — .ps1 и .xml.
В итоге получается следующая команда:
Get-ChildItem -Path C:\rootfolder\*\sub1\* -Include folder1,folder2,sub1,sub2,sub3,*.ps1,*.xml
Что касается дальнейшего увеличения длины пути или добавления звездочек, например:
Get-ChildItem -Path C:\rootfolder\*\sub1\*\sub3
или
Get-ChildItem -Path C:\rootfolder\*\sub1\*\sub3\*
то здесь действуют те же самые принципы, что и в примерах этой статьи, разве что количество элементов в значении параметра -Include будет увеличиваться.
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell