Элементы, находящиеся на дисках 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" открывается в нем.




Содержание