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.

powershelllogo

  • 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!