Tabla de Contenidos

Powershell

Es el framework de Microsoft para gestión de la configuración y administración de sistemas de Microsoft. Está formado por un shell para línea de comandos, y un lenguaje de script basado en la plataforma .NET. Viene incluido en Windows desde el año 2006 y en 2016 Microsoft lo hizo Open Source y multiplataforma (Windows, Linux, Mac).

Snippets

Text expander

# Asistente de escritura
 
# Este script hace estas 4 cosas constantemente:
 
# 1. Mira lo que estás escribiendo en el teclado
# 2. Guarda las últimas teclas en una “memoria corta” (buffer)
# 3. Comprueba si lo que has escrito coincide con una palabra especial (,,pl, ,,firma, etc.)
# 4. Si coincide:
#       borra esa palabra
#       pega una plantilla completa
 
# OJO: durante un tiempo se sustituye lo que haya en el portapapeles
# así que lo que se quiera copiar, hay que copiarlo después de que
# se dispare una plantilla
 
Add-Type -AssemblyName System.Windows.Forms
 
# ============================================
# API WINDOWS
# ============================================
 
Add-Type @"
using System;
using System.Runtime.InteropServices;
 
public class Win32 {
 
    [DllImport("user32.dll")]
    public static extern short GetAsyncKeyState(Int32 vKey);
}
"@
 
# ============================================
# SNIPPETS / PLANTILLAS
# ============================================
 
$snippets = @{
 
    ",,pl" = @"
Fecha:
Hora:
ID incidencia:
Comentarios:
"@
 
    ",,firma" = @"
Fulanito Pérez
ACME, Inc
Extensión 1234
"@
 
}
 
# ============================================
# BUFFER
# ============================================
 
# Aquí se irán guardando las últimas pulsaciones de teclas
# para revisar si coinciden con las plantillas definidas
$buffer = ""
$maxLength = 50
 
Write-Host ""
Write-Host "====================================="
Write-Host " Snippets activos"
Write-Host " Ctrl+C para salir"
Write-Host "====================================="
Write-Host ""
 
# ============================================
# MAPEO TECLAS
# ============================================
 
# Convertir teclas en texto 
 
# Al pulsar las teclas se obtiene el código y no el caracter
# en sí (65 para la A, 188 para la coma...)
function Get-KeyChar($vk) {
 
    switch ($vk) {
 
        # Letras A-Z
        {$_ -ge 65 -and $_ -le 90} {
            return ([char]$vk).ToString().ToLower()
        }
 
        # Números 0-9
        {$_ -ge 48 -and $_ -le 57} {
            return [char]$vk
        }
 
        # Espacio
        32 { return " " }
 
        # Coma
        188 { return "," }
 
        # Punto
        190 { return "." }
 
        # Guion
        189 { return "-" }
 
        default { return $null }
    }
}
 
# ============================================
# PEGADO RÁPIDO MEDIANTE PORTAPAPELES
# ============================================
 
function Send-Text($text) {
 
    try {
 
        # Guardar portapapeles actual
        $oldClipboard = Get-Clipboard -Raw -ErrorAction SilentlyContinue
 
        # Copiar plantilla al portapapeles
        Set-Clipboard -Value $text
 
        Start-Sleep -Milliseconds 50
 
        # Pegar (CTRL+V)
        [System.Windows.Forms.SendKeys]::SendWait("^v")
 
        Start-Sleep -Milliseconds 50
 
        # Restaurar portapapeles anterior
        if ($null -ne $oldClipboard) {
            Set-Clipboard -Value $oldClipboard
        }
    }
    catch {
 
        Write-Host "Error usando clipboard"
    }
}
 
# ============================================
# LOOP PRINCIPAL
# ============================================
 
while ($true) {
 
    Start-Sleep -Milliseconds 20
 
    foreach ($vk in 1..255) {
 
        # Obtiene la tecla que se está pulsando 
        $state = [Win32]::GetAsyncKeyState($vk)
 
        # Tecla recién pulsada
        if ($state -eq -32767) {
 
            $char = Get-KeyChar $vk
 
            if ($char) {
 
                $buffer += $char
 
                # Limitar tamaño del buffer
                if ($buffer.Length -gt $maxLength) {
                    $buffer = $buffer.Substring($buffer.Length - $maxLength)
                }
 
                foreach ($trigger in $snippets.Keys) {
 
                    # ¿Lo último que ha escrito el usuario coincide con uno de mis atajos?
                    if ($buffer.EndsWith($trigger)) {
 
                        Start-Sleep -Milliseconds 50
 
                        # Borrar trigger escrito
                        for ($i = 0; $i -lt $trigger.Length; $i++) {
                            [System.Windows.Forms.SendKeys]::SendWait("{BACKSPACE}")
                        }
 
                        Start-Sleep -Milliseconds 50
 
                        # Pegar plantilla
                        Send-Text $snippets[$trigger]
 
                        # Reset buffer
                        $buffer = ""
 
                        break
                    }
                }
            }
        }
    }
}

Recursos