Элементы, находящиеся на дисках Windows PowerShell (например, файлы и папки дисков файловой системы и разделы реестра на дисках реестра Windows PowerShell), называются в Windows PowerShell элементами. Командлеты для работы с ними содержат в своих именах существительное Item.
Вывод команды Get-Command -Noun Item показывает, что существует девять командлетов Windows PowerShell для работы с элементами.
PS> Get-Command -Noun Item CommandType Name Definition ----------- ---- ---------- Cmdlet Clear-Item Clear-Item [-Path] <String[]... Cmdlet Copy-Item Copy-Item [-Path] <String[]>... Cmdlet Get-Item Get-Item [-Path] <String[]> ... Cmdlet Invoke-Item Invoke-Item [-Path] <String[... Cmdlet Move-Item Move-Item [-Path] <String[]>... Cmdlet New-Item New-Item [-Path] <String[]> ... Cmdlet Remove-Item Remove-Item [-Path] <String[... Cmdlet Rename-Item Rename-Item [-Path] <String>... Cmdlet Set-Item Set-Item [-Path] <String[]> ...
Создание новых элементов (командлет New-Item)
Для создания в файловой системе нового элемента используйте командлет New-Item. Включите параметр Pathс указанием пути к элементу и параметр ItemType со значением file или directory.
Например, чтобы создать новый каталог с именем "New.Directory" в каталоге "C:\Temp", введите:
PS> New-Item -Path c:\temp\New.Directory -ItemType Directory Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2006-05-18 11:29 AM New.Directory
Для создания файла измените значение параметра ItemType на file. Например, чтобы создать файл с именем "file1.txt" в каталоге "New.Directory", введите:
PS> New-Item -Path C:\temp\New.Directory\file1.txt -ItemType file Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\temp\New.Directory Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2006-05-18 11:44 AM 0 file1
Можно использовать тот же метод для создания нового раздела реестра. По сути, раздел реестра создать даже проще, поскольку единственным типом, присутствующим в реестре Windows, является раздел реестра. (Записи реестра являются свойствами элементов.) Например, чтобы создать раздел с именем "_Test" во вложенном разделе реестра "CurrentVersion", введите:
PS> New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros oft\Windows\CurrentVersion SKC VC Name Property --- -- ---- -------- 0 0 _Test {}
При вводе пути реестра обязательно нужно использовать двоеточие (:) в именах дисков Windows PowerShell, таких как HKLM: Без двоеточия оболочка Windows PowerShell не распознает имя диска в пути.
Почему параметры реестра не являются значениями
При использовании командлета Get-ChildItem для поиска элементов в разделе реестра никогда не показываются действительные записи реестра или их значения.
Например, раздел реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run обычно содержит несколько записей реестра, которые представляют приложения, запускаемые при загрузке системы.
Однако если использовать для просмотра дочерних элементов этого раздела командлет Get-ChildItem, будет показан только вложенный раздел OptionalComponents:
PS> Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Run Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Micros oft\Windows\CurrentVersion\Run SKC VC Name Property --- -- ---- -------- 3 0 OptionalComponents {}
Несмотря на то, что было бы удобно рассматривать записи реестра как элементы, нельзя указать путь к записи реестра таким образом, чтобы обеспечить его уникальность. Обозначение пути не позволяет различить вложенные разделы реестра с именем Run и запись реестра (Default) во вложенном разделе Run. К тому же, поскольку имена записей реестра могут содержать знак обратной косой черты (\), если бы записи реестра были элементами, обозначение пути Windows\CurrentVersion\Run было бы неотличимо от вложенного раздела, который расположен по этому пути.
Переименование существующих элементов (командлет Rename-Item)
Чтобы переименовать файл или папку, нужно использовать командлет Rename-Item. Следующая команда переименовывает файл file1.txt в fileOne.txt.
PS> Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt
Командлет Rename-Item может переименовать файл или папку, но не может переместить элемент. Следующая команда завершается с ошибкой, поскольку происходит попытка переместить файл из каталога "New.Directory" в каталог "Temp".
PS> Rename-Item -Path C:\temp\New.Directory\fileOne.txt c:\temp\fileOne.txt Rename-Item : Cannot rename because the target specified is not a path. At line:1 char:12 + Rename-Item <<<< -Path C:\temp\New.Directory\fileOne c:\temp\fileOne.txt
Перемещение элементов (командлет Move-Item)
Для перемещения файла или папки используйте командлет Move-Item.
Например, следующая команда перемещает каталог New.Directory из каталога C:\temp в корневой каталог диска C: Чтобы подтвердить перемещение элемента, включите параметр PassThru в командлет Move-Item. Без параметра Passthru командлет Move-Item не показывает сообщения о результатах.
PS> Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2006-05-18 12:14 PM New.Directory
Копирование элементов (командлет Copy-Item)
Знакомым с операциями копирования других оболочек поведение командлета Copy-Item в Windows PowerShell может показаться необычным. При копировании элемента из одного расположения в другое командлет Copy-Item по умолчанию не копирует его содержимое.
Например, при копировании каталога New.Directory из каталога C: в каталог C:\temp команда выполняется успешно, но файлы каталога New.Directory не копируются.
PS> Copy-Item -Path C:\New.Directory -Destination C:\temp
Если вывести содержимое папки C:\temp\New.Directory, станет видно, что файлы в ней отсутствуют:
PS> Get-ChildItem -Path C:\temp\New.Directory PS>
Почему же командлет Copy-Item не копирует содержимое каталога в новое местоположение?
Командлет Copy-Item создавался как универсальный и служит не только для копирования файлов и папок. Также даже при копировании файлов или папок может возникнуть необходимость скопировать только контейнер без содержащихся в нем элементов.
Для копирования всего содержимого папки включите в командлет Copy-Item параметр Recurse. Если каталог уже скопирован без содержимого, добавьте параметр Force, что позволит переписать пустую папку.
PS> Copy-Item -Path C:\New.Directory -Destination C:\temp -Recurse -Force -Passthru Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2006-05-18 1:53 PM New.Directory Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\temp\New.Directory Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2006-05-18 11:44 AM 0 file1
Удаление элементов (командлет Remove-Item)
Для удаления файла или папки используйте командлет Remove-Item. Такие командлеты Windows PowerShell, как Remove-Item, могущие внести значительные необратимые изменения, часто запрашивают подтверждение выполнения команд. Например, при перемещении папки New.Directory будет предложено подтвердить команду, поскольку папка содержит файлы:
PS> Remove-Item C:\New.Directory Confirm The item at C:\temp\New.Directory has children and the -recurse parameter was not 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"):
Поскольку Yes является ответом по умолчанию, чтобы удалить папку и ее файлы, нажмите клавишу Enter. Чтобы удалить папку без подтверждения, используйте параметр -Recurse.
PS> Remove-Item C:\temp\New.Directory -Recurse
Выполнение элементов (командлет Invoke-Item)
Windows PowerShell использует командлет Invoke-Item для выполнения действия по умолчанию для файла или папки. Это действие по умолчанию определяется указанным в реестре обработчиком приложения по умолчанию; производимый результат соответствует результату двойного щелчка элемента в проводнике Windows.
Предположим, что выполнена следующая команда:
PS> Invoke-Item C:\WINDOWS
В результате будет отображено окно проводника с текущей папкой "C:\Windows", как будто была дважды щелкнута папка "C:\Windows".
Если файл Boot.ini вызывается на компьютере с операционной системой, предшествующей Windows Vista:
PS> Invoke-Item C:\boot.ini
Если тип файла INI ассоциирован с приложением Блокнот, файл "boot.ini" открывается в нем.