Get-ChildItem: Список файлов и папок с PowerShell

Помните добрые старые времена команды DOS `dir`? Как насчет команды Linux `ls`? Если да, то Get-childItem в основном то же самое, но поднятое на новый уровень.

Фактически, у нас даже есть `dir` и `ls` в PowerShell в виде псевдонима. Команда PowerShell Get-Childitem может не только перечислять файлы и папки в файловой системе через консоль PowerShell или PowerShell сценарий, но также перечислять ключи реестра и значения, сертификаты в различных хранилищах сертификатов, а также даже в Active Directory, чтобы назвать несколько.

Если вы новичок или средний скриптер PowerShell, обязательно посмотрите мой БЕСПЛАТНЫЙ мини-курс по созданию инструмента PowerShell! 9,000+ слов глубокого объяснения и идей о том, как создать инструмент PowerShell.

Для понимания Get-Childitem сначала думайте о нем в отношении `dir` и `ls`, но вместо просто файлов он рассматривает множество объектов как дочерний элемент и перечисляет их. Вы можете использовать псевдоним или полное имя команды для его использования.

Поскольку эта команда доступна с PowerShell v1, вы можете быть уверены, что она будет работать с вашей версией PowerShell.

Get-ChildItem Пересекается с деревом

A file system is a hierarchy. It has a folder structure with files inside of folders and those folders inside of other folders. A file system is like a tree. That tree has a trunk (C:\ for example) and “branches” coming off of it (folders). In fact, we even have a tree command.

PS> tree
Folder PATH listing for volume HD
Volume serial number is 0000007B 22DC:666C
C:.
 \modules
   \AdsiPS
     \1.0.0.2
       \Public
       \AWSPowerShell
<SNIP>

Вы можете направить эту команду на локальные пути на локальном компьютере, использовать блок сценария PowerShell для удаленного доступа и использовать Get-ChildItem внутри него, или просто указать UNC-путь. Все работают одинаково. Может быть, мне просто хочется перечислить все файлы в текущем каталоге.

PS> dir -Path .
PS> Invoke-Command -ComputerName SERVER1 -Scriptblock { dir -Path . }

Поставщики PowerShell

Microsoft поняла, что навигация по структуре файловой системы, похожей на “дерево”, может быть применена и к другим системам. В файловой системе “дерево” имеет папки и файлы, но в реестре есть ключи и значения, в то время как в системе сертификатов Windows есть хранилища и сертификаты внутри этих хранилищ. Каждая из этих конкретных областей может быть представлена в виде дерева, поэтому был создан провайдер PowerShell. Зачем весь этот разговор о провайдерах PowerShell? Потому что команда Get-ChildItem является частью cmdlet *-Item, которые взаимодействуют с дисками PowerShell, предоставляемыми каждым провайдером.

Команда Get-ChildItem может выводить любое количество объектов на диске PowerShell и позволяет обрабатывать каждый элемент через конвейер или, возможно, в цикле foreach в PowerShell. Она понимает концепцию диска PowerShell, что позволяет указывать Path файловой системы, ключ реестра или хранилище сертификатов – все в одном.

Как видно ниже, эта команда может перечислить папку C:\, раздел текущего пользователя в реестре, а также хранилище сертификатов PowerShell.

PS> Get-ChildItem -Path C:\


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         7/2/2017   7:01 AM                AppData
d-----        4/25/2017   4:36 PM                CheckPoint

PS> Get-ChildItem -Path HKCU:\


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
BCD00000000

PS> dir -Path Cert:\


Location   : CurrentUser
StoreNames : {TrustedPublisher, ClientAuthIssuer, Root, UserDS...}

Фильтрация

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

Например, синтаксис фильтрации Filter вида Name -eq 'foo' может быть полностью приемлемым при запросе файлов, но вообще не сработает при запросе реестра, потому что провайдер реестра даже не имеет фильтра!

PS> dir HKLM:\ -Filter "Name -eq 'foo'"
ls : Cannot call method. The provider does not support the use of filters.
At line:1 char:1 + ls HKLM:\ -Filter "Name -eq 'foo'" +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo          :
NotImplemented: (:) [Get-ChildItem], PSNotSupportedException     +
FullyQualifiedErrorId :
NotSupported,Microsoft.PowerShell.Commands.GetChildItemCommand

Когда ничего не помогает, всегда можно воспользоваться также параметрами Include и Exclude.

Эта команда в PowerShell также имеет несколько параметров, специфичных для файловой системы, таких как Force, который выводит скрытые файлы и папки, File и Directory, которые находят только файлы или папки. Посмотрите полное описание Get-ChildItem через Get-Help или в документации Microsoft.

Еще одна крутая особенность Get-ChildItem – это его способность разрешать пути при использовании символа подстановки. В PowerShell символ подстановки обычно представляет любое значение. Например, если вы хотите увидеть все файлы с расширением .txt, просто укажите путь к папке и *.txt.

PS> Get-ChildItem -Path 'C:\*.txt'

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

PS> Get-ChildItem -Path C:\ -Attributes R -File

Резюме

Эта команда PowerShell – одна из тех, которые вы будете использовать многократно. В большинстве случаев вы, вероятно, будете использовать провайдер FileSystem, но важно помнить, что эта команда способна на гораздо большее. Используйте ее для запросов файлов, папок, ключей реестра, значений реестра, сертификатов, пользователей Active Directory, компьютеров или даже переменных среды, функций и многого другого!

В случае сомнений выполните команду Get-PSDrive, чтобы увидеть список всех загруженных дисков PowerShell, которые Get-ChildItem может опрашивать для вас.

Source:
https://adamtheautomator.com/get-childitem/