Powershell es indispensable en nuestra gestión diaria, hoy vamos a ver algunos cmdlets básicos en powershell en cuanto a la manipulación de ficheros y directorios. Estos serán básicos a posteriori en muchos de nuestros scripts y como siempre nos ahorrarán tiempo y recursos en cualquier tarea.
Gestión básica de ficheros y directorios en Powershell
- Cmdlet Get-ChildItem
Con este cmdlet podremos listar los archivos y directorios dentro de un directorio, con el parámetro “Force” mostraremos todos aquellos archivos ocultos o de sistema. Con el siguiente ejemplo listamos todos los archivos y directorios localizados en c:
Get-ChildItem -Force c:\
Para mostrar todo el contenido, incluyendo el de los subdirectorios podremos utilizar el parámetro“Recurse”
Get-ChildItem -Force c:\ -Recurse
Así mismo podremos afinar los resultados utilizando parámetros como “Path”, “Filter”, “Include” y “Exclude”. Con Path podemos indicar la ruta sobre la cual queremos mostrar el contenido, pudiendo utilizar rutas tipo c:\directorio o por ejemplo utilizando las variables de entorno a través de la variable $env (podemos listar el contenido de la misma con Get-ChildItem env:). Sigamos con los parámetros, con Include y Exclude podemos seleccionar que tipos de archivos queremos listar, y finalmente con Filter podremos crear filtros relativamente complejos como los que veremos a continuación en el ejemplo utilizando la opción Where-Object.
Utilizando todo lo anterior listaremos todos los ficheros .avi contenidos en nuestra carpeta de usuario, que hayan sido modificados en 2016 y que tengan un tamaño mayor de 1mb y menor de 10mb
Get-ChildItem -Path $env:HOMEPATH -Recurse -Include *.avi | Where-Object -FilterScript {($_.LastWriteTime -gt "2016-01-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}
- Cmdlet Copy-Item
Para copiar utilizaremos el cmdlet Copy-Item, como podemos ver en el ejemplo siguiente en el que copiamos un archivo a otro directorio
Copy-Item -Path c:\ejemplo.txt -Destination c:\backup
Podríamos también especificar el nombre de archivo en destino en caso que quisieramos cambiarle el nombre o la extensión. También podríamos usar el parámetro “Force” para forzar la sobreescritura en caso que en el destino existiese un archivo con el mismo nombre, esta opción funciona incluso cuando el directorio de destino es solo de lectura.
Copy-Item -Path c:\ejemplo.txt -Destination c:\backup\ejemplocopia.txt -Force
Para copiar directorios completos el comando es el mismo, utilizando un parámetro que hemos visto antes, “Recurse” para copiar todos los subdirectorios.
Copy-Item -Path c:\musica -Recurse c:\archivo\musica
Y como hemos visto también en ejemplos anteriores podemos granular esta copia, por ejemplo seleccionando solos los archivos .mp3
Copy-Item -Filter *.mp3 -Path c:\musica -Recurse -Destination c:\archivo\musica
- Cmdlet New-Item
Para crear nuevos archivos y directorios utilizaremos el cmdlet New-Item de manera muy sencilla como veremos en los siguientes 2 ejemplos, siempre especificando el tipo (directorio o archivo)
New-Item -Path c:\musica\nuevodirectorio -ItemType directory
O para ficheros
New-Item -Path c:\musica\lista.txt -ItemType file
El parámetro “Path” la podemos obviar si el directorio de trabajo es donde nos encontramos en ese momento.
- Cmdlet Remove-Item
Para eliminar un fichero o directorio simplemente utilizaremos lo siguiente
Remove-Item c:\musica
En caso que queramos borrar un directorio y este no esté vacío se nos pedirá confirmación, podemos obviar esto a través del parámetro “Recurse”.
- Cmdlet Rename-Item
Como no también podremos renombrar los ficheros o directorios, también de manera muy sencilla como vemos a continuación.
Rename-Item -Path c:\musica\lista.txt c:\musica\listado.txt
Un ejemplo a continuación de cómo podríamos renombrar sistemáticamente todos los archivos, en este caso, sustituiremos la cadena “rock” por “pop-rock”. En este pequeño script podemos ver la asignación primero la asignación de todos los nombres de fichero a la variable $files (array) y luego el trabajo sobre cada uno de sus valores con el bucle foreach.
$files = Get-ChildItem -Path C:\musica
foreach ($file in $files)
{
$newFileName=$file.Name.Replace("rock","pop-rock")
Rename-Item $file $newFileName
}
- Cmdlet move-item
Este cmdlet lo utilizaremos para mover tanto directorios como ficheros a otra localización, de nuevo muy sencillo, como siempre podemos usar el parámetro “Force” para sobreescribir
Move-Item c:\musica\rock c:\backupmusica\
- Cmdlet subst
Subst nos permite mapear directorios como si fueran unidades locales. Por ejemplo vamos a hacer que la carpeta c:\musica nos aparezca tanto en shell como en Windows como la unidad M:\
Subst m: c:\musica
Aquí como en un ejemplo anterior podemos asignar unidades a variables de entorno con la variable $env.
- Cmdlet Get-Content
Por último vamos a ver el cmdlet Get-Content, el cual nos permite leer el contenido de un archivo. Con su forma más simple, veremos en pantalla el contenido del mismo
Get-Content -Path c:\musica\lista.txt
Podemos a su vez, simplemente obtener el número de lineas del archivo con
(Get-Content -Path c:\musica\lista.txt).Lenght
O redirigir el contenido a una variable (que en este caso pasará a ser un array)
$listamusica = Get-Content -Path c:\musica\lista.txt
Estos son solo algunos ejemplos sencillos de manipulación de ficheros y directorios en Powershell, como siempre las posibilidades en vuestros scripts de Powershell son infinitas por lo que happy scripting!