Работа с файлами, папками и разделами реестра
Этот пример применяется только к платформам 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
PowerShell