Buscar y remplazar palabras en ficheros recursivamente con PowerShell

En algunas ocasiones instalamos aplicamos de terceros para realizar tareas que podemos realizar nosotros mismos con las herramientas que nos proporciona Microsoft Windows. Ademas, tenemos la ventaja de poder personalizarlo al 100%. En este ejemplo, vamos a realizar un script de PowerShell que busque y remplace ciertas palabras en el contenido de los ficheros con extensión html. Buscará en todos los ficheros recursivamente que esten dentro de una carpeta o subcarpetas y nos mostrará por pantalla cuántos ficheros le quedan por modificar. Podéis descargaros el ejemplo completo aquí (recordar cambiar el fichero ejecutar.txt por ejecutar.bat)

Paso 1 – Crear una estructura de carpetas

He creado una carpeta en c: llamada PowerShell para guardar el código y dentro una carpeta llamada Ficheros, donde debes copiar todos los ficheros a modificar.

Paso 2 – Crear el script

  1. Dentro de la carpeta PowerShell crea un fichero de texto, en mi caso Script_miguel_troyano y cámbiale la extensión por .ps1
  2. Editalo con tu editor de texto preferido, en mi caso utilizo siempre notepad++
  3. Copia y pega el siguiente código y guarda el fichero.
# Autor: Miguel Troyano
# URL: www.migueltroyano.com
# Descripcion: Script de powershell que sustituye una palabra por otra masivamente

# Si ocurre algun error no continuara con el proceso
$ErrorActionPreference = "Stop"

# Mensaje por pantalla
Write-Output "Ejecutando script, por favor espere..."

# Paso 1:  definicion de variables
$fecha= $(get-date -Format 'dd/MM/yyyy, hh:mm')
$v_Directorio = $v_Directorio

#varaibles de busqueda y remplazo
$v_Busqueda_1 = '#000000'
$v_Remplazo_1 = '#ffffff'
$v_Busqueda_2 = '#010101'
$v_Remplazo_2 = '#ffffff'

# Se abre y modifica fichero por fichero para sustituir palabras
try {
	write $v_Directorio
	$contador = (Get-ChildItem -Recurse ./Ficheros ).count
	 $i = 1
	Get-ChildItem $v_Directorio -Recurse *.html | Where {$_ -IS [IO.FileInfo]} |
	% {
	(Get-Content $_.FullName) -creplace $v_Busqueda_1,$v_Remplazo_1-creplace $v_Busqueda_2,$v_Remplazo_2 | Set-Content $_.FullName
	
	 $contador | ForEach-Object {
		Write-Progress -Activity "Modificando... " -Status "Fichero n∫ $i de $($contador)"
		$i++
		}
	}
}
catch {
	Write-Warning "Error 01: Se ha producido un error al modificar los ficheros html"
	"($fecha) - ($_.Exception.Message)" | Out-File .\errorlog.txt -Append
}
	
Write-Output ""
Write-Output "Fin de la ejecucion"Lenguaje del código: PHP (php)

En el código anterior se puede observar en las lineas 15 y 16 cómo se va buscar el color hexadecimal #000000 y se va reemplazar por #ffffff. Reemplaza estás lineas para establecer que palabra quieres buscar en tu fichero y por cuál se va sustituir. En las líneas 17 y 18 realizamos lo mismo pero para otra palabra.

Si no quieres buscar y remplazar en ficheros .html modifica la linea 25 y cambia *.html por la extensión que tengan tus ficheros, por ejemplo *.txt

Paso 3 – Crear un lanzador

El siguiente paso es crear un fichero por lotes (.bat) que será el encargado de ejecutar nuestro script.

  1. En la carpeta PowerShell crea un fichero de texto y renombrarlo a Ejecutar.bat
  2. Copia y pega el siguiente código y guarda el fichero.
@echo off
Powershell.exe -executionpolicy remotesigned -File .\Script_miguel_troyano.ps1Lenguaje del código: CSS (css)

Paso 4 – Ejecutar

Haz doble clic sobre el fichero ejecutar.bat y deberá mostrarte por el número de fichero que va y cuantos le quedan. Es posible que la ventana se abra y se cierre rápidamente, pero eso es debido a que se ha completado el script. Ejemplo:

Si algo ha ido mal encontraras en tu carpeta PowerShell un fichero llamado errorlog.txt con el detalle del error.

Escribir un comentario