Los procedimientos para desplazarse por las unidades de Windows PowerShell y manipular los elementos que contienen son similares a los que se utilizan para manipular archivos y carpetas en unidades de disco físicas de Windows. En esta sección explicaremos cómo realizar tareas específicas de manipulación de archivos y carpetas.
Mostrar todos los archivos y carpetas que contiene una carpeta
Puede obtener todos los elementos incluidos directamente en una carpeta usando Get-ChildItem. Agregue el parámetro opcional Force para mostrar los elementos ocultos o del sistema. Por ejemplo, este comando muestra el contenido directo de la unidad C de Windows PowerShell (que es el mismo que la unidad C física de Windows):
Get-ChildItem -Force C:\
Este comando enumera sólo los elementos contenidos directamente, de forma muy parecida al comando DIR de Cmd.exe o ls de un shell de UNIX. Para que se muestren los elementos contenidos, también debe especificar el parámetro -Recurse (esta operación puede tardar mucho tiempo en completarse). Para mostrar todo el contenido de la unidad C:
Get-ChildItem -Force C:\ -Recurse
Get-ChildItem puede filtrar elementos con los parámetros Path, Filter, Include y Exclude, pero estos parámetros se basan normalmente solo en el nombre. Puede aplicar filtros complejos basándose en otras propiedades de los elementos utilizando el cmdlet Where-Object.
El siguiente comando busca todos los archivos ejecutables en la carpeta Archivos de programa que se modificaron por última vez después del 1 de octubre de 2005 y cuyo tamaño se encuentra entre 1 megabyte y 10 megabytes:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt "2005-10-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}
Copiar archivos y carpetas
Las operaciones de copia se realizan con Copy-Item. El siguiente comando crea una copia de seguridad de C:\boot.ini en C:\boot.bak:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak
Si el archivo de destino ya existe, la copia no se podrá realizar. Para sobrescribir un destino que ya existe, utilice el parámetro Force:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force
Este comando se puede usar incluso con un destino de sólo lectura.
La copia de carpetas se realiza de la misma manera. Este comando copia recursivamente la carpeta C:\temp\test1 en la nueva carpeta c:\temp\DeleteMe:
Copy-Item C:\temp\test1 -Recurse c:\temp\DeleteMe
También puede copiar una selección de elementos. El siguiente comando copia todos los archivos .txt incluidos en cualquier ubicación de c:\data en c:\temp\text:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination c:\temp\text
También se pueden usar otras herramientas para realizar copias del sistema de archivos. Los objetos XCOPY, ROBOCOPY y COM, como Scripting.FileSystemObject, se pueden utilizar todos ellos en Windows PowerShell. Por ejemplo, puede usar la clase Scripting.FileSystem COM de Windows Script Host para crear una copia de seguridad de C:\boot.ini en C:\boot.bak:
(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")
Crear archivos y carpetas
La creación de nuevos elementos se realiza de la misma manera en todos los proveedores de Windows PowerShell. Si un proveedor de Windows PowerShell incluye varios tipos de elementos (por ejemplo, el proveedor FileSystem de Windows PowerShell distingue entre directorios y archivos), deberá especificar el tipo de elemento.
Este comando crea una nueva carpeta C:\temp\New Folder:
New-Item -Path 'C:\temp\New Folder' -ItemType "directory"
Este comando crea un nuevo archivo vacío C:\temp\New Folder\file.txt:
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType "file"
Eliminar todos los archivos y carpetas que contiene una carpeta
Puede quitar elementos contenidos usando Remove-Item, pero se le pedirá que confirme la eliminación si el elemento contiene algo más. Por ejemplo, si intenta eliminar la carpeta C:\temp\DeleteMe que contiene otros elementos, Windows PowerShell le solicitará confirmación antes de eliminar la carpeta:
Remove-Item C:\temp\DeleteMe Confirm The item at C:\temp\DeleteMe 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"):
Si no desea que se le pregunte por cada elemento contenido, especifique el parámetro Recurse:
Remove-Item C:\temp\DeleteMe -Recurse
Asignar una carpeta local como una unidad accesible desde Windows
También puede asignar una carpeta local usando el comando subst. El siguiente comando crea una unidad local P: cuya raíz es el directorio local Archivos de programa:
subst p: $env:programfiles
Al igual que sucede con las unidades de red, las unidades asignadas en Windows PowerShell usando subst se muestran inmediatamente en el shell de Windows PowerShell.
Leer un archivo de texto en una matriz
Uno de los formatos más comunes de almacenamiento de datos de texto es un archivo con líneas independientes tratadas como elementos de datos distintos. El cmdlet Get-Content permite leer un archivo completo en un solo paso, como se muestra a continuación:
PS> Get-Content -Path C:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=AlwaysOff /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional with Data Execution Prevention" /noexecute=optin /fastdetect
Get-Content trata los datos leídos del archivo como una matriz, con un elemento por línea de contenido del archivo. Para confirmar esto, compruebe el valor de Length del contenido devuelto:
PS> (Get-Content -Path C:\boot.ini).Length 6
Este comando es muy útil para obtener listas de información directamente en Windows PowerShell. Por ejemplo, puede almacenar una lista de nombres de equipos o direcciones IP en un archivo C:\temp\domainMembers.txt, con un nombre en cada línea del archivo. Get-Content permite recuperar el contenido del archivo y colocarlo en la variable $Computers:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers es ahora una matriz que contiene un nombre de equipo en cada elemento.