Работа с файлами, папками и разделами реестра

Этот пример применяется только к платформам Windows.

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

Перечисление файлов, папок и разделов реестра

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

Если вы хотите вернуть все файлы и папки, содержащиеся непосредственно в папке C:\Windows, введите:

PS> Get-ChildItem -Path C:\Windows
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Windows

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-16   8:10 AM          0 0.log
-a---        2005-11-29   3:16 PM         97 acc1.txt
-a---        2005-10-23  11:21 PM       3848 actsetup.log
...

Описание выглядит примерно так, как вы увидите при вводе dir команды в cmd.exeили ls команде в командной оболочке UNIX.

Сложные описания можно выполнять с помощью параметров командлета Get-ChildItem . Синтаксис командлета Get-ChildItem можно увидеть, введя следующее.

Get-Command -Name Get-ChildItem -Syntax

Эти параметры можно скомбинировать и сопоставить для получения настраиваемых выходных данных.

Перечисление всех содержащихся элементов

Чтобы увидеть оба элемента в папке Windows и все элементы во вложенных папках, используйте параметр Recurse для Get-ChildItem. В списке отображается все, что находится в папке Windows, а также элементы в ее вложенных папках. Например:

PS> Get-ChildItem -Path C:\WINDOWS -Recurse

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\AppPatch
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM    1852416 AcGenral.dll
...

Фильтрация элементов по имени

Чтобы отобразить только имена элементов, используйте параметр Name для Get-Childitem.

PS> Get-ChildItem -Path C:\WINDOWS -Name
addins
AppPatch
assembly
...

Принудительное перечисление скрытых элементов

Элементы, скрытые в проводник или cmd.exe не отображаются в выходных Get-ChildItem данных команды. Чтобы показать скрытые элементы, используйте параметр Force для Get-ChildItem. Например:

Get-ChildItem -Path C:\Windows -Force

Этот параметр называется Force , так как вы можете принудительно переопределить нормальное поведение Get-ChildItem команды. Force — это широко используемый параметр, который заставляет действие, которое командлет обычно не выполняет, хотя он не может выполнять какие-либо действия, которые компрометирует безопасность системы.

Сопоставление имен элементов с дикими карта

Команда Get-ChildItem принимает подстановочные знаки в пути к элементам списка.

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

  • Звездочка (*) соответствует нулю или большему количеству вхождений любого символа.
  • Знак вопроса (?) соответствует ровно одному символу.
  • Открывающая квадратная скобка ([) и закрывающая квадратная скобка (]) заключают в себя набор символов для сопоставления.

Далее приводится несколько примеров работы спецификации из подстановочных знаков.

Чтобы найти в каталоге Windows все файлы, имеющие суффикс .log и ровно пять символов в основном имени, введите следующую команду.

PS> Get-ChildItem -Path C:\Windows\?????.log

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Windows
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
...
-a---        2006-05-11   6:31 PM     204276 ocgen.log
-a---        2006-05-11   6:31 PM      22365 ocmsn.log
...
-a---        2005-11-11   4:55 AM         64 setup.log
-a---        2005-12-15   2:24 PM      17719 VxSDM.log
...

Чтобы найти в каталоге Windows все файлы с именами, начинающимися на букву x, введите следующее.

Get-ChildItem -Path C:\Windows\x*

Чтобы найти все файлы с именами, начинающимися на x или z, введите следующее.

Get-ChildItem -Path C:\Windows\[xz]*

Дополнительные сведения о подстановочных знаках см. в разделе about_Wildcards.

Исключение элементов

Вы можете исключить определенные элементы с помощью параметра Get-ChildItem"Исключить". Это позволит вам выполнить сложную фильтрацию в одном операторе.

Например, вы пытаетесь найти библиотеку службы времени Windows в папке System32 и все, что вам известно об имени библиотеки, — то, что оно начинается с W и содержит 32.

Такое выражение, как w*32*.dll, найдет все библиотеки DLL, которые отвечают этим условиям, но вам может потребоваться дополнительно отфильтровать файлы и пропустить все файлы win32. Эти файлы можно исключить с помощью параметра "Исключить" с шаблономwin*:

PS> Get-ChildItem -Path C:\WINDOWS\System32\w*32*.dll -Exclude win*

    Directory: C:\WINDOWS\System32

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           3/18/2019  9:43 PM         495616 w32time.dll
-a---           3/18/2019  9:44 PM          35328 w32topl.dll
-a---           1/24/2020  5:44 PM         401920 Wldap32.dll
-a---          10/10/2019  5:40 PM         442704 ws2_32.dll
-a---           3/18/2019  9:44 PM          66048 wsnmp32.dll
-a---           3/18/2019  9:44 PM          18944 wsock32.dll
-a---           3/18/2019  9:44 PM          64792 wtsapi32.dll

Сочетание параметров Get-ChildItem

В одной команде можно использовать несколько параметров командлета Get-ChildItem. Перед тем как комбинировать параметры, убедитесь, что понимаете принципы сопоставления подстановочных знаков. Например, следующая команда не возвращает результатов:

Get-ChildItem -Path C:\Windows\*.dll -Recurse -Exclude [a-y]*.dll

Результаты отсутствуют, даже если существуют две библиотеки, которые начинаются на букву z в папке Windows.

Результаты не возвращены, так как подстановочный знак указан как часть пути. Хотя команда и была рекурсивной, командлет Get-ChildItem ограничил элементы до тех, которые находятся в папке Windows с именами, заканчивающимися на .dll.

Чтобы указать рекурсивный поиск для файлов, имена которых соответствуют специальному шаблону, используйте параметр Include.

PS> Get-ChildItem -Path C:\Windows -Include *.dll -Recurse -Exclude [a-y]*.dll

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Windows\System32\Setup

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM       8261 zoneoc.dll

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Windows\System32

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM     337920 zipfldr.dll