Прямое управление элементами
Элементы, которые отображаются на дисках 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
будет открыт в Блокноте.
PowerShell