Работа с файлами, папками и разделами реестра
Этот пример применяется только к платформам Windows.
PowerShell использует существительное Item для обозначения элементов, найденных на диске 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.
Исключение элементов
Вы можете исключить определенные элементы с помощью параметра Exclude для Get-ChildItem . Это позволит вам выполнить сложную фильтрацию в одном операторе.
Например, вы пытаетесь найти библиотеку службы времени Windows в папке System32 и все, что вам известно об имени библиотеки, — то, что оно начинается с W и содержит 32.
Такое выражение, как w*32*.dll , найдет все библиотеки DLL, которые отвечают этим условиям, но вам может потребоваться дополнительно отфильтровать файлы и пропустить все файлы win32. Эти файлы можно опустить с помощью параметра Exclude с шаблоном 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 и управление элементами на них аналогично управлению файлами и папками на дисках Windows. В этой статье описывается выполнение конкретных задач по управлению файлами и папками с помощью PowerShell.
Перечисление всех файлов и папок в папке
Все элементы можно получить непосредственно в папке с помощью Get-ChildItem . Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает непосредственное содержимое диска C: PowerShell .
Get-ChildItem -Path C:\ -Force
Команда выводит список только непосредственно содержащихся элементов, аналогично использованию dir команды в cmd.exe оболочке UNIX или ls в ней. Чтобы отобразить элементы во вложенной папке, необходимо указать параметр Recurse . Следующая команда выводит список всех элементов на C: диске:
Get-ChildItem -Path C:\ -Force -Recurse
Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Вы можете выполнять сложную фильтрацию на основе других свойств элементов с помощью Where-Object .
Следующая команда находит все исполняемые файлы в папке Program Files, которые в последний раз были изменены после 1 октября 2005 года и не имеют ни меньше 1 мб, ни 10 мегабайт:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript
Копирование файлов и папок
Копирование выполняется с помощью командлета Copy-Item . Следующая команда выполняет резервное копирование до C:\boot.ini C:\boot.bak :
Copy-Item -Path C:\boot.ini -Destination C:\boot.bak
Если целевой файл уже существует, то попытка копирования завершается неудачей. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force.
Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force
Эта команда работает, даже если целевой объект доступен только для чтения.
Так же выполняется и копирование папок. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.
Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe
Можно также скопировать избранные элементы. Следующая команда копирует все .txt файлы, содержащиеся в любом месте в C:\data C:\temp\text :
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
Для копирования элементов файловой системы можно использовать и другие средства. Объекты XCOPY, ROBOCOPY и COM, такие как Scripting.FileSystemObject, работают в PowerShell. Например, можно использовать com-класс Scripting.FileSystem узла сценариев Windows для резервного копирования C:\boot.ini в C:\boot.bak :
(New-Object -ComObject Scripting.FileSystemObject).CopyFile('C:\boot.ini', 'C:\boot.bak')
Создание файлов и папок
Создание новых элементов работает одинаково на всех поставщиках PowerShell. Если поставщик PowerShell имеет несколько типов элементов ( например, поставщик FileSystem PowerShell различает каталоги и файлы), необходимо указать тип элемента.
Эта команда создает папку C:\temp\New Folder :
New-Item -Path 'C:\temp\New Folder' -ItemType Directory
Эта команда создает пустой файл C:\temp\New Folder\file.txt .
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File
При использовании параметра Force с командой New-Item для создания папки, которая уже существует, она не перезапишет и не заменит папку. Будет просто возвращен имеющийся объект папки. Однако при использовании New-Item -Force в уже существующем файле файл будет перезаписан.
Удаление всех файлов и папок в папке
Удалить вложенные элементы можно с помощью командлета Remove-Item , однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удалить папку C:\temp\DeleteMe , содержащую другие элементы, PowerShell запросит подтверждение перед удалением папки:
Remove-Item -Path C:\temp\DeleteMe Confirm The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Если вы не хотите запрашивать каждый содержащийся элемент, укажите параметр Recurse :
Remove-Item -Path C:\temp\DeleteMe -Recurse
Сопоставление локальной папки в качестве диска
Отобразить локальную папку можно с помощью команды New-PSDrive . Следующая команда создает локальный диск P: , корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell:
New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem
Как и в случае с сетевыми дисками, диски, сопоставленные в PowerShell, сразу же отображаются в оболочке PowerShell. Чтобы создать сопоставленный диск, видимый из проводник, используйте параметр Persist. Однако с параметром Persist можно использовать только удаленные пути.
Чтение текстового файла в массив
Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее:
PS> Get-Content -Path C:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=AlwaysOff /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional with Data Execution Prevention" /noexecute=optin /fastdetect
Get-Content обрабатывает данные, считанные из файла, как массив с одним элементом в каждой строке содержимого файла. Убедиться в этом можно, проверив свойство Length полученного содержимого:
PS> (Get-Content -Path C:\boot.ini).Length 6
Эта команда наиболее полезна для получения списков сведений в PowerShell. Например, можно сохранить список имен компьютеров или IP-адресов в файле C:\temp\domainMembers.txt с одним именем в каждой строке файла. Вы можете использовать командлет Get-Content , чтобы извлечь содержимое файла и поместить его в переменную $Computers :
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера.
Как получить список файлов в папке Windows
Отображает список файлов и подкаталогов каталога. Если используется без параметров, эта команда отображает метку тома и серийный номер диска, а затем список каталогов и файлов на диске (включая их имена, дату и время последнего изменения). Для файлов эта команда отображает расширение имени и размер в байтах. Эта команда также отображает общее количество перечисленных файлов и каталогов, их совокупный размер и свободное пространство (в байтах), оставшееся на диске.
Команда dir также может выполняться из консоли восстановления Windows с использованием различных параметров. Дополнительные сведения см. в разделе Среда восстановления Windows (WinRE).
Синтаксис
dir [:][][] [. ] [/p] [/q] [/w] [/d] [/a[[:]]][/o[[:]]] [/t[[:]]] [/s] [/b] [/l] [/n] [/x] [/c] [/4] [/r]
Параметры
- d — каталоги
- h — скрытые файлы
- s — системные файлы
- l — точки повторного анализа
- r — файлы, доступные только для чтения
- a — файлы, готовые к архивации
- i — не файлы с индексированием содержимого
- n — по имени в алфавитном порядке
- e — по алфавиту по расширению
- g — сначала каталоги групп
- s — по размеру, самый маленький первый
- d — по дате и времени, самый старый первый
- — Использование префикса для изменения порядка сортировки
- c — создание
- a — последний доступ
- w — последняя запись
Комментарии
- Чтобы использовать несколько параметров имени файла , разделите каждое имя файла пробелом, запятыми или точкой с запятой.
- Вы можете использовать подстановочные знаки (* или ?), чтобы представить один или несколько символов имени файла, а также для отображения подмножества файлов или подкаталогов.
- Можно использовать подстановочный знак *, чтобы заменить любую строку символов, например:
- dir *.txt выводит список всех файлов в текущем каталоге с расширениями, начинающимися с .txt, например .txt, TXT1 и .txt_old.
- dir read *.txt выводит список всех файлов в текущем каталоге, которые начинаются с чтения и с расширениями, начинающимися с .txt, например .txt, TXT1 или .txt_old.
- dir read *.* выводит список всех файлов в текущем каталоге, которые начинаются с чтения с любым расширением.
Подстановочный знак звездочки всегда использует короткое сопоставление имен файлов, поэтому вы можете получить непредвиденные результаты. Например, следующий каталог содержит два файла (t.txt2 и t97.txt):
C:\test>dir /x Volume in drive C has no label. Volume Serial Number is B86A-EF32 Directory of C:\test 11/30/2004 01:40 PM . 11/30/2004 01:40 PM .. 11/30/2004 11:05 AM 0 T97B4~1.TXT t.txt2 11/30/2004 01:16 PM 0 t97.txt
Возможно, при вводе dir t97\* текста будет возвращен файл t97.txt. Однако при вводе dir t97\* возвращаются оба файла, так как подстановочный знак звездочки соответствует файлу t.txt2 для t97.txt с помощью карты коротких имен T97B4~1.TXT. Аналогичным образом при вводе del t97\* будут удалены оба файла.
Примеры
Чтобы отобразить все каталоги один за другим, в алфавитном порядке, в широком формате и с приостановкой после каждого экрана, убедитесь, что корневым каталогом является текущий каталог, а затем введите:
dir /s/w/o/p
В выходных данных перечислены корневой каталог, подкаталоги и файлы в корневом каталоге, включая расширения. Эта команда также перечисляет имена подкаталогов и имена файлов в каждом подкаталоге дерева.
Чтобы изменить предыдущий пример так, чтобы в dir отображались имена файлов и расширения, но имена каталогов пропускались, введите:
dir /s/w/o/p/a:-d
Чтобы напечатать описание каталога, введите:
dir > prn
При указании prn список каталогов отправляется на принтер, подключенный к порту LPT1. Если принтер подключен к другому порту, необходимо заменить prn именем правильного порта.
Вы также можете перенаправить выходные данные команды dir в файл, заменив prn именем файла. Можно также ввести путь. Например, чтобы направить выходные данные dir в файл dir.doc в каталоге Records, введите:
dir > \records\dir.doc
Если dir.doc не существует, dir создает его, если каталог Records не существует. В этом случае появится следующее сообщение:
File creation error
Чтобы отобразить список всех имен файлов с расширением .txt во всех каталогах на диске C, введите:
dir c:\*.txt /w/o/s/p
Команда dir отображает в широком формате список соответствующих имен файлов в каждом каталоге в алфавитном порядке и приостанавливается при каждом заполнении экрана, пока вы не нажмете любую клавишу для продолжения.
Связанные ссылки
- Условные обозначения синтаксиса команд командной строки
Источник: https://learn.microsoft.com/ru-ru/windows-server/administration/windows-commands/dir