Comandos útiles en Powershell
Me gustaría hablar en este post de algunos comandos que, ya sea por necesidad o simplemente por curiosidad, uno se va encontrando por el camino. Son los siguientes:
Envío de mensajes de correo con archivos adjuntos (solo para Powershell v5)
Una funcionalidad interesante es la posibilidad de que un script pueda enviar un mensaje de correo electrónico con uno o más archivos adjuntos.
Cabe destacar que este cmdlet solo está disponible para Powershell v5. Los parámetros básicos que hay que indicarle son bastante intuitivos:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Se definen los campos del mensaje $subjectMessage = "Este es el motivo del mensaje" $bodyMessage= "Este es el cuerpo del mensaje" # Tambien se podría capturar el contenido de un archivo de texto plano con Get-Content archivo.txt $addressDest = "alguien@lugar.com" # La direccion de correo de destino $addressFrom = "remitente@lugar.com" # La dirección de quién envía el mensaje $attachedFile = "adjunto.txt" # El fichero adjunto al mensaje $servidorSMTP = "smtp.servidor.com" # El servidor SMTP $prioridad = "High" # La prioridad del mensaje. Puede ser "Low", "Normal" o "High" #Hay otros parámetros posibles, como establecer los correos en copia, puerto alternativo al 25, etc. # Se envía el mensaje Send-MailMessage -To $addressDest -From $addressFrom -SMTPserver $servidorSMTP -Subject $subjectMessage -Body $bodyMessage -Attachments $attachedFile -Priority $prioridad |
Creación de un trabajo o job en el planificador de tareas
Si bien esto se puede realizar directamente con el interfaz gráfico del propio planificador de tareas, la posibilidad de creación o eliminación dinámica de un job mediante Powershell puede ser bastante útil, sobre todo en el caso de integrarla en un script.
La ejecución de un job requiere de cuatro elementos principales:
a) El elemento que se va a lanzar, que puede ser un ejecutable, un batch o un script.
b) Los argumentos que empleará dicho elemento, separados por comas.
c) El disparador o ‘trigger’, evento que actúa de detonante en la ejecución del job. Por ejemplo, una hora concreta de un dia determinado.
d) Las opciones adicionales del propio job.
1 2 3 4 5 6 7 8 9 10 11 12 |
# Se definen los parámetros del job $jobOptions = New-ScheduledJobOption -RunElevated # En este caso, se indica que la consola que ejecute el job sea de administrador $jobName = "nombreDelJob" # La denominación del job. Es buena idea que sea mínimamente descriptivo $jobPathFile = ".carpetascript.ps1" # El archivo o script a ser lanzado $jobDate = (Get-Date).AddDays(2) # Establece una fecha sumándole dos días a la actual $jobTrigger = New-JobTrigger -Once -At $jobDate # Establece el trigger o evento que activará la ejecución del job # Se registra el job Register-ScheduledJob -Name $jobName -FilePath $jobPathFile -ArgumentList $arg1,$arg2,$arg3 -ScheduledJobOption $jobOptions -Trigger $jobTrigger # Para ver todos los jobs planificados Get-ScheduledJob |
Algo a señalar es que, si hay que eliminar un job existente y éste ha sido creado con el anterior comando, es recomendable hacerlo con este otro:
1 |
Unregister-ScheduledJob -Name "nombreDelJob" |
ya que si bien es posible hacerlo con el interfaz gráfico del planificador de tareas, posteriormente al utilizar comandos Powershell relacionados con esto, por ejemplo Get-ScheduledJob, se puede producir un mensaje de error.
Alerta sonora
Un complemento a una alerta visual (como un mensaje o aviso), puede ser la emisión de algún tipo de sonido. Esto puede ser interesante a la hora de introducir algún tipo de alerta sonora para indicar algún evento relevante, como por ejemplo que se ha encontrado algo o la misma finalización de un script.
En su forma más simple, se puede indicar el código de control correspondiente a la alerta, mediante el siguiente comando:
1 |
echo "`a" |
Esto puede servir para indicar un tipo de evento, pero es bastante limitado. Sin embargo, es posible reproducir sonidos del sistema o incluso archivos con extensión .wav. No hace falta decir que esta última forma es que la que gana en versatilidad al resto
1 2 3 4 5 6 |
# Reproducir un sonido wav $sound = new-Object System.Media.SoundPlayer; $sound.SoundLocation="c:WINDOWSMedianotify.wav"; # Hay que indicar la ruta absoluta del archivo $sound.Play() #Para reproducirlo $sound.PlayLooping() #Para reproducirlo en loop infinito $sound.Stop() #Para detener la reproducción. Unica manera de hacerlo, si el sonido está en loop |
Uso de un puerto serie
Aunque de por sí el puerto serie en sí puede estar en desuso, sin embargo nunca ha dejado de utilizarse. Así, por ejemplo, se emplea para comunicarse con microcontroladores diversos. La conexión se puede llevar a cabo mediante una conexión física y empleando, al menos, las tres señales mínimas (TxD, RxD, GND) sin control de flujo, o incluso una conexión inalámbrica empleando Bluetooth. Bluetooth suporta múltiples perfiles, y uno de ellos es el SPP (Serial Profile Port), el cual a efectos prácticos lo hace comportarse como un puerto serie estándar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# Para comprobar los puertos series disponibles en el sistema: [System.IO.Ports.SerialPort]::getportnames() # O bien de una manera más exhaustiva: Get-WMIObject Win32_SerialPort # Establecer los parámetros básicos de conexión. Una tipica conexión 9600 bps, 8N1 sin control de flujo sería la siguiente: $puertoCOM="COM4" # El puerto serie que se quiere emplear $bps=9600 # La tasa de baudios por segundo del puerto. Típicos valores entre 1200 (o incluso menos) y 115200 (o incluso más) $paridad=[System.IO.Ports.Parity]::None # Paridad de datos. Puede ser Even (par), Odd (impar) o None (sin paridad) $dataBits=8 # Bits de datos. Puede ser 7 u 8 $stopBits=[System.IO.Ports.StopBits]::one # Bits de parada. Puede ser one (1), onepointfive (1.5) o two (dos) $puerto=New-Object System.IO.Ports.SerialPort $puertoCOM,$bps,$paridad,$dataBits,$stopBits # Crea la nueva instancia # Se pueden establecer otros parámetros, como la activación del control del flujo por RTS/CTS , DTR/DSR, Handshake, fijar el tamaño de los buffers de lectura y escritura o establecer los timeouts de lectura. Todos estos parámetros, así como el estado general del resto, se pueden consultar llamando al objeto: $puerto $puerto.ReadTimeout=500 # Establece un timeout de lectura de 500 mseg $puerto.WriteTimeout=250 # Establece un timeout de escritura de 250 mseg # Abre el puerto $puerto.Open() # Lectura del puerto $mensaje=$puerto.ReadLine() # Escritura del puerto $mensaje="Esto es un mensaje" $puerto.WriteLine($mensaje) # Cierra el puerto $puerto.Close() |
Y esto es todo por ahora. Espero que alguien pueda sacar provecho de alguno de estos cmdlet para dotar de más funcionalidad a algún script de Powershell.