Manipular elementos directamente
Lo que ve en las unidades de PowerShell, como los archivos y carpetas o las caves del Registro, se llaman elementos en PowerShell. Los cmdlets que funcionan con los elementos contienen el término Item en sus nombres.
La salida del comando Get-Command -Noun Item
indica que hay nueve cmdlets de elemento de PowerShell.
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[]> ...
Creación de nuevos elementos
Para crear un nuevo elemento en el sistema de archivos, use el cmdlet New-Item
. Incluya el parámetro Path con la ruta de acceso al elemento y el parámetro ItemType con un valor file
o directory
.
Por ejemplo, para crear un directorio con el nombre New.Directory
en el directorio C:\Temp
, escriba:
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
Para crear un archivo, cambie el valor del parámetro ItemType por file
. Por ejemplo, para crear un archivo con el nombre file1.txt
en el directorio New.Directory
, escriba:
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
Esta misma técnica se puede usar para crear una clave del Registro. De hecho, una clave del Registro es más fácil de crear porque se trata del único tipo de elemento que hay en el Registro de Windows. (Las entradas del Registro son propiedades de elementos). Por ejemplo, para crear una clave llamada _Test
en la subclave CurrentVersion
, escriba:
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 {}
Cuando escriba una ruta de acceso del Registro, no olvide incluir dos puntos (:
) en los nombres de unidad de PowerShell, HKLM:
y HKCU:
. Sin los dos puntos, PowerShell no reconoce el nombre de la unidad en la ruta de acceso.
¿Por qué los valores del Registro no son elementos?
Si usa el cmdlet Get-ChildItem
para encontrar los elementos de una clave del Registro, nunca verá las entradas del Registro de verdad ni sus valores.
Por ejemplo, la clave del Registro HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
suele contener varias entradas del Registro que representan las aplicaciones que se ejecutan cuando se inicia el sistema.
Sin embargo, si usa Get-ChildItem
para buscar elementos secundarios en la clave, solamente verá la subclave OptionalComponents
de la clave:
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 {}
Aunque sería conveniente tratar las entradas del Registro como elementos, no se puede especificar una ruta de acceso a una entrada del Registro de una manera que garantice que sea única. La notación de ruta de acceso no distingue entre la subclave del Registro Run y la entrada del Registro (Default) en la subclave Run.
Es más, dado que los nombres de las entradas del Registro pueden contener el carácter de barra diagonal inversa (\
), si las entradas del Registro fueran elementos, no podría usar la notación de ruta de acceso para distinguir una entrada del Registro llamada Windows\CurrentVersion\Run
de la subclave que se encuentra en esa ruta de acceso.
Cambio de nombre de los elementos existentes
Para cambiar el nombre de un archivo o una carpeta, use el cmdlet Rename-Item
. El comando a continuación cambia el nombre del archivo file1.txt
por fileOne.txt
.
Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt
El cmdlet Rename-Item
puede cambiar el nombre de un archivo o una carpeta, pero no puede mover un elemento. El comando a continuación genera un error porque intenta mover el archivo del directorio New.Directory
al directorio Temp.
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
Movimiento de elementos
Para mover un archivo o una carpeta, use el cmdlet Move-Item
.
Por ejemplo, el comando siguiente mueve el directorio New.Directory del directorio C:\temp
a la raíz de la unidad C:
. Para confirmar que el elemento se ha movido, incluya el parámetro PassThru del cmdlet Move-Item
. Sin PassThru, el cmdlet Move-Item
no muestra ningún resultado.
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
Copia de elementos
Si conoce las operaciones de copia de otros shells, el comportamiento del cmdlet Copy-Item
de PowerShell le resultará inusual. Al copiar un elemento de una ubicación en otra, Copy-Item
no copia el contenido de forma predeterminada.
Por ejemplo, si copia el directorio New.Directory
de la unidad C: al directorio C:\temp
, el comando se ejecuta correctamente, pero los archivos del directorio New.Directory no se copian.
Copy-Item -Path C:\New.Directory -Destination C:\temp
Si muestra el contenido de C:\temp\New.Directory
, verá que no hay archivos:
PS> Get-ChildItem -Path C:\temp\New.Directory
PS>
¿Por qué el cmdlet Copy-Item
no copia el contenido en la nueva ubicación?
El cmdlet Copy-Item
está diseñado para ser genérico; no sirve para copiar archivos y carpetas.
Además, incluso cuando se copian archivos y carpetas, conviene copiar solo el contenedor y no los elementos que hay en él.
Para copiar todo el contenido de una carpeta, incluya el parámetro Recurse del cmdlet Copy-Item
en el comando. Si ya ha copiado el directorio sin su contenido, agregue el parámetro Force, que permite sobrescribir la carpeta vacía.
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
Eliminar elementos
Para eliminar archivos y carpetas, use el cmdlet Remove-Item
. Los cmdlets de PowerShell, como Remove-Item
, que pueden realizar cambios importantes e irreversibles, suelen pedir confirmación cuando se especifican sus comandos. Por ejemplo, si intenta quitar la carpeta New.Directory
, se le pide que confirme el comando, ya que la carpeta contiene archivos:
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"):
Dado que Yes
es la respuesta predeterminada, presione la tecla Entrar para eliminar la carpeta y sus archivos. Para quitar la carpeta sin confirmar, use el parámetro Recurse.
Remove-Item C:\temp\New.Directory -Recurse
Ejecución de elementos
PowerShell usa el cmdlet Invoke-Item
para realizar una acción predeterminada en un archivo o una carpeta. Esta acción predeterminada viene determinada por el controlador de aplicación predeterminado en el Registro; el efecto es el mismo que si hiciera doble clic en el elemento en el Explorador de archivos.
Por ejemplo, suponga que ejecuta el siguiente comando:
Invoke-Item C:\WINDOWS
Aparece una ventana del Explorador en C:\Windows
, como si hubiera hecho doble clic en la carpeta C:\Windows
.
Si invoca al archivo Boot.ini
en un sistema anterior a Windows Vista:
Invoke-Item C:\boot.ini
Si el tipo de archivo .ini
está asociado con el Bloc de notas, el archivo boot.ini
se abre en el Bloc de notas.