Поделиться через


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

Этот пример применяется только к платформам 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, так и все элементы, содержащиеся в вложенных папках, используйте параметр RecurseGet-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. Чтобы отобразить скрытые элементы, используйте параметр ForceGet-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
...

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

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

Чтобы найти все файлы, имена которых начинаются с "x" или "z", введите:

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

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

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

Можно исключить конкретные элементы с помощью параметра ExcludeGet-ChildItem. Это позволяет выполнять сложную фильтрацию в одной инструкции.

Например, предположим, что вы пытаетесь найти библиотеку DLL службы времени Windows в папке System32, и все, что можно вспомнить о имени библиотеки DLL, заключается в том, что она начинается с "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

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

Результаты не были возвращены, так как мы указали подстановочный знак в качестве части пути. Несмотря на то, что команда была рекурсивной, командлет 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