Прямое управление элементами

Элементы, которые отображаются на дисках PowerShell, таких как файлы и папки или разделы реестра, называются "Элементы " в PowerShell. Командлеты для работы с ними содержат существительное Item в именах.

В выходных данных команды Get-Command -Noun Item показано, что в PowerShell существует девять командлетов типа Item.

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 командлет. Включите параметр Path с путем к элементу и параметр ItemType со значением file или directory.

Например, чтобы создать каталог с именем New.Directory в каталоге C:\Temp, введите:

New-Item -Path c:\temp\New.Directory -ItemType Directory
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18  11:29 AM            New.Directory

Чтобы создать файл, измените значение параметра ItemType на file. Например, чтобы создать каталог с именем file1.txt в каталоге New.Directory, введите:

New-Item -Path C:\temp\New.Directory\file1.txt -ItemType file
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-18  11:44 AM          0 file1

Тот же метод можно использовать для создания нового раздела реестра. На самом деле, раздел реестра создать проще, так как единственный тип элементов в реестре Windows — это раздел. (Записи реестра являются свойствами элементов.) Например, чтобы создать ключ с именем _Test в подразделеCurrentVersion, введите:

New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test
   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

SKC  VC Name                           Property
---  -- ----                           --------
  0   0 _Test                          {}

При вводе пути реестра не забудьте добавить двоеточие (:) в имена дисков Windows PowerShell — HKLM: и HKCU:. Без двоеточия PowerShell не распознает имя диска в пути.

Почему значения реестра не являются элементами

При использовании командлета Get-ChildItem для поиска элементов в разделе реестра вы не увидите фактических записей реестра или их значений.

Например, раздел реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run обычно содержит записи реестра, представляющие приложения, которые выполняются при запуске системы.

Однако при Get-ChildItem поиске дочерних элементов в ключе все, что вы увидите, является OptionalComponents подразделом ключа:

Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Run
   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
SKC  VC Name                           Property
---  -- ----                           --------
  3   0 OptionalComponents             {}

Хотя было бы удобно рассматривать записи реестра как элементы, невозможно указать путь к записи реестра таким образом, чтобы обеспечить уникальность. Нотация пути не отличается от подраздела реестра с именем Run и записью реестра по умолчанию в подразделе Run. Кроме того, поскольку имена записей реестра могут содержать символ обратной косой черты (\), если записи реестра были элементами, то не удалось использовать нотацию пути, чтобы отличить запись реестра с именем Windows\CurrentVersion\Run от подраздела, расположенного в этом пути.

Переименование существующих элементов

Чтобы изменить имя файла или папки, используйте командлет Rename-Item. Следующая команда изменяет имя файла file1.txt на fileOne.txt.

Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt

Командлет Rename-Item может изменить имя файла или папки, но он не может переместить элемент. Произойдет сбой следующей команды, так как она попытается переместить файл из каталога New.Directory во временный каталог.

Rename-Item -Path C:\temp\New.Directory\fileOne.txt c:\temp\fileOne.txt
Rename-Item : can't rename because the target specified isn't a path.
At line:1 char:12
+ Rename-Item  <<<< -Path C:\temp\New.Directory\fileOne c:\temp\fileOne.txt

Перемещение элементов

Чтобы переместить файл или папку, используйте командлет Move-Item.

Например, следующая команда перемещает каталог New.Directory из C:\temp каталога в корневой C: каталог диска. Чтобы убедиться, что элемент перемещен, включите параметр PassThru командлета Move-Item. Без PassThruMove-Item командлет не отображает результаты.

Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18  12:14 PM            New.Directory

Копирование элементов

Если вы знакомы с операциями копирования в других оболочках, вы можете найти поведение командлета Copy-Item в PowerShell, чтобы быть необычным. При копировании элемента из одного расположения в другое Copy-Item не копируется его содержимое по умолчанию.

Например, если скопировать New.Directory каталог из диска C: в C:\temp каталог, команда завершается успешно, но файлы в каталоге New.Directory не копируются.

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 не только для копирования файлов и папок. Кроме того, даже при копировании файлов и папок может потребоваться копировать только контейнер без элементов внутри него.

Чтобы скопировать все содержимое папки, включите параметр Recurse командлета Copy-Item в команду. Если вы уже скопировали каталог без содержимого, добавьте параметр Force, который позволит перезаписать пустую папку.

Copy-Item -Path C:\New.Directory -Destination C:\temp -Recurse -Force -Passthru
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18   1:53 PM            New.Directory

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-18  11:44 AM          0 file1

Удаление элементов

Чтобы удалить файлы и папки, используйте командлет Remove-Item. Например, Remove-Itemкомандлеты PowerShell, которые могут вносить значительные необратимые изменения, часто запрашивают подтверждение при вводе команд. Например, при попытке удалить папку New.Directory вам предлагается подтвердить команду, так как папка содержит файлы:

Remove-Item C:\temp\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 является ответом по умолчанию, чтобы удалить папку вместе файлами, нажмите клавишу ВВОД. Чтобы удалить папку без подтверждения, используйте параметр -Recurse.

Remove-Item C:\temp\New.Directory -Recurse

Выполнение элементов

В PowerShell используется командлет Invoke-Item, чтобы выполнить действие по умолчанию для файла или папки. Это действие по умолчанию определяется обработчиком приложений по умолчанию в реестре; эффект будет таким же, что и при двойном щелчке элемента в проводнике.

Предположим, вы запускаете следующую команду:

Invoke-Item C:\WINDOWS

Откроется окно Обозреватель, которое находится C:\Windows в ней, как если бы вы дважды щелкнули папкуC:\Windows.

При вызове файла Boot.ini в системе, предшествующей Windows Vista:

Invoke-Item C:\boot.ini

Если тип файла .ini связан с Блокнотом, файл boot.ini будет открыт в Блокноте.