funcion para buscar cadena de texto en un archivo con powershell

Todos los lenguajes de programación disponen de funciones que nos facilitan la vida a los programadores, pero están suelen ser muy limitadas. Por este motivo y por muchos otros siempre es necesario definir nuestras propias funciones.

Hoy os voy a contar como definir una función en powershell con un ejemplo muy útil: buscar una cadena de texto en un archivo.

Definición de la función:

function buscarCadena([String]$cadena , [String]$file) {
    # Se verifica que el fichero existe y la cadena no es nula
    if ((Test-Path -Path $file) -and $cadena) {
        $list = Get-Content $file
        # Si se encuentra la cadena se devuelve true
        if ($list -match $cadena) {
            return $true
        }
    }
    # Se devuelve false si no encuentra nada o el fichero no existe
    return $false
}

Como véis la función se define con la palabra “function” seguido del nombre que le queráis poner a la función. Después entre paréntesis se indican los parámetros que sean necesarios, en caso de no necesitar parámetros, los paréntesis deben ir vacíos.

Después entre llaves va el código de la función. En este caso lo que hace la función es leer el archivo pasado por parámetro y busca el texto que también se pasa por parámetro.

El resultado de la función (que no imprescindible) se indica con el comando “return” seguido del valor a devolver. En el caso de la función del ejemplo, devuelve $false o $true, dependiendo de si se ha encontrado la cadena de texto buscada o no.

Ejemplo de llamada a la función:

buscarCadena "texto a buscar" "c:\archivo.txt"

El resultado de esta llamada se puede usar de muchas maneras, por ejemplo, en un if o asignando el resultado a una variable.

if (buscarCadena "texto a buscar" "c:\archivo.txt") { ..... }

$existeCadena = buscarCadena "texto a buscar" "c:\archivo.txt"

escribir en un fichero con powershell

Siempre puede venir bien guardar cierta información en un archivo.

Para ello, powershell dispone de varios métodos. Uno de ellos es el cmdlet Out-File que tiene opciones para sobreescribir un archivo, añadir el texto que queramos al final del mismo o guardar el fichero en formato ascii o unicode.

Vamos a pasar a los ejemplos.

1. Escribir un texto en un archivo, sobreescribiéndolo en caso de que existiera.

$textoAGuardar | Out-File -FilePath $rutaDelArchivo

2. Escribir un texto en un archivo, sobreescribiéndolo en caso de que existiera incluso si es de sólo lectura.

$textoAGuardar | Out-File -FilePath $rutaDelArchivo -Force

3. Escribir un texto en un archivo, añadiendo el texto al final en caso de que existiera.

$textoAGuardar | Out-File -FilePath $rutaDelArchivo -Append

4. Escribir un texto en un archivo, sobreescribiéndolo en caso de que existiera con formato ASCII.

$textoAGuardar | Out-File -FilePath $rutaDelArchivo -Encoding ASCII

5. Escribir el contenido de un objeto en un archivo, sobreescribiéndolo en caso de que existiera.

Out-File -FilePath $rutaDelArchivo -Encoding ASCII -InputObject $textoAGuardar

Podéis encontrantar más ayuda en la web de microsoft

arrancar y parar servicios con powershell

Todos los que de alguna forma nos dedicados a la administración de sistemas por algún motivo hemos tenido que enfrentarnos a los servicios del sistema. Hoy voy a comentar una forma para parar y arrancar servicios utilizando llamadas a cmdlets de powershell.

Comando para Parar un servicio:

Stop-Service -name "Examinador de equipos" -force

Con esto se dentendrá el servicio cuyo nombre indicamos. El parámetro -force obligará al servicio a detenerse.

Comando para Arrancar un servicio:

Start-Service -name "Examinador de equipos"

Con este otro cmdlet conseguiremos arrancar el servicio indicado.

Con ambos comandos se puede comprobar que el resultado de la acción ha sido la deseada consultando la variable $? después de la ejecución del comando. Si la ejecución es correcta el comando devolverá “True” y en caso contrario “False“.

definir variables globales en powershell

La utilización de variables globales es muy interesante en determinadas ocasiones, por lo que os voy a contar cómo se puede hacer esto con powershell.

Para definir una variable global tan sólo hay que anteponer al nombre de la variable “global:“, es decir, para definir una variable “prueba” que sea global, habría que poner lo siguiente:

$global:prueba = "valor deseado"

El comportamiento de esta variable será el siguiente:

function cambiarValor() {
    $global:prueba = "valor dentro función"
}

$global:prueba = "valor inicial"
cambiarValor

Si no definieramos la variable como global, el valor de la variable después de ejecutar la función “cambiarValor” sería “valor inicial“, pero al definirla como global, la variable mantiene el valor que se le ha asignado en la función, es decir, “valor dentro función“.

Podéis ver el ejemplo en la siguiente imagen.
variables globales en powershell

obtener la longitud de un archivo con powershell

En esta entrada os voy a enseñar como obtener el tamaño de un archivo. Pongo el código y después lo explico:

$fichero = 'c:\prueba.log'
if (Test-Path -Path $fichero) {
    $fileSize = (Get-ItemProperty -Path $fichero).Length
        if ($fileSize -gt 15000) {
         ... tu codigo ...
    }
}

En resumen, lo que hace el código es verificar que existe el archivo “c:\prueba.log” (variable $fichero) con ayuda de “Test-Path” y en caso de que exista mira el tamaño del mismo, guardando el valor en la variable $filesize en bytes.
Una vez que tenemos el tamaño, podemos hacer con ese dato lo que queramos. En mi caso, lo suelo usar para verificar que el tamaño no supere un límite prefijado (en este caso 15000 bytes).