ByteJoiner PowerShell Script

Per petició d’un colega, he fet aquest script, partit del codi del ByteSplitter però en aquest cas fa el contrari i la font són 4 fitxers.

Si tenim 4 fitxers de la materixa longitud i plens amb cada escun els mateixos caràcters (aaa… bbb… ccc… ddd…) el resultat final seria un fitxer 4 vegades la longitud original amb el seguent contingut

abcdabcdabcd….

Function doSomething() {
    $ProgressBar1.value = 0
    # Read the entire file to an array of bytes.
    $bytes1 = [System.IO.File]::ReadAllBytes($sourcePath1.text)
    $bytes2 = [System.IO.File]::ReadAllBytes($sourcePath4.text)
    $bytes3 = [System.IO.File]::ReadAllBytes($sourcePath5.text)
    $bytes4 = [System.IO.File]::ReadAllBytes($sourcePath6.text)
    $size = $bytes1.count
    $byte = @(0) * ( $size*4 )
    for ($i=0; $i -le $size-1; $i++) {
        $byte[(4*$i)] = $bytes1[$i]
        $byte[(4*$i)+1] = $bytes2[$i]
        $byte[(4*$i)+2] = $bytes3[$i]
        $byte[(4*$i)+3] = $bytes4[$i]
        $ProgressBar1.value = ( $i / $size ) * 100
    }
    $ProgressBar1.value = ( $i / $size ) * 100
    [System.IO.File]::WriteAllBytes($destinationPath.text + '.joint', $byte)
    [System.Windows.MessageBox]::Show('Done')
}

Semblant al ByteSplitter, es carreguen els 4 fitxers en memòria i es crea una variable de longitud $size*4 partint del primer fitxer.

Al fitxer resultant s’afegirà l’extensió .joint.

Decàrga: ByteJoiner (887 downloads )

ByteSplitter Powershell Script

Com va passar amb SwapByte, he portat aquesta eina que podeu trobar compilada per Mac Os a Powershell.

No comento molt, simplemement és l’script del SwapByte modificat perquè creï dos fitxers, un .lo i un .hi amb els bytes alts i baixos pertinents de fitxers de 16bits.

Function doSomething() { 
    $ProgressBar1.value = 0 
    # Read the entire file to an array of bytes. 
    $bytes = [System.IO.File]::ReadAllBytes($sourcePath.text) 
    $size = $bytes.count 
    $lo_bytes = @(0) * ( $size/2 ) 
    $hi_bytes = @(0) * ( $size/2 ) 
    for ($i=0; $i -le $size-1; $i=$i+2) { 
        $lo_bytes[$i/2] = $bytes[$i] 
        $hi_bytes[$i/2] = $bytes[$i+1] 
        $ProgressBar1.value = ( $i / $size ) * 100 
    } 
    [System.IO.File]::WriteAllBytes($destinationPath.text + '.lo', $lo_bytes) 
    [System.IO.File]::WriteAllBytes($destinationPath.text + '.hi', $hi_bytes) 
    [System.Windows.MessageBox]::Show('Done') 
}

S’inicialitzen dues variables noves amb la meitat del tamany original i a ón s’aniràn afegint els bytes, al final desem els fitxer de destí afegint .lo i .hi.

Decàrga: ByteSplitter Powershell Script (16072 downloads )

Temps al temps, timers (comptadors) al Powershell

Avui m’he trobat amb una petita necessitat al Powershell, al mateix moment que necessitava tenir un formulari, també tenia la necessitat de que en aquest aparagués un compte enrere.

Les opcións més ràpides era emprar compració de temps, capturant l’inicial i indicant quants segons havien passat des d’aquest punt. L’altre era utilitzar un StopWatch, una sort de cronometre que ens permet tenir un càlcul mes fàcil de consultar (segons, minuts, hores…) des del moment que l’iniciem.

Però el problema és que, entre lectura i lectura, si faig un Start-Sleep (o Sleep a seques), l’aplicació queda completament parada i, necessito que l’usuari faci click a un botó. Bàsicament buscava un formulari amb un compte enrere i que aquest el pugui aturar.

Així que, tal i com jo veig Powershell i sobretot conjutament amb Windows.Forms, és que no deixa de ser una sort de Visual Basic de la vella escola, així que em vaig preguntar “com ho faria això jo en Visual Basic?” i la solució era amb un Timer.

» Read more

IP Scanner en Powershell

Per raons de feina tenia qeu fer molt sovint pings a un rang d’ips de la xarxa, així que vaig pensar que millor fer un petit script en Powershell i Windows Forms per poder fer quelcom.

Ja sé que existeixen diferentes eines que ens ajuden amb això (Angrey Ip Scanner per exemple), però mai s’ha de perdre l’oportunitat de poder picar codi i fer-se un mateix les propies eines.

L’aplicació funciona al voltant d’una simple linia de codi que des de la consola de Powershell ja podem fer l’escaneig d’IPs

1..254 | ForEach-Object {Get-WmiObject Win32_PingStatus -Filter "Address='192.168.0.$_' and Timeout=200 and ResolveAddressNames='true' and StatusCode=0" | select ProtocolAddress*}

Aquesta linia de codi la podem trobar a https://daniel.streefkerkonline.com/2015/04/28/simple-ip-range-scan-using-powershell/

» Read more

Formularis amb Powershell

Fa uns dies, buscant scripts útils de powershell per veure si es podia aprofitar alguna cosa per la feina, em vaig trobar que parlaven de formularis amb powershell ¿?

Sembla que hi ha integrat un sistema per a generar formularis i fer una interfície molt més visual i agradable en el cas que sigui necessari. L’exemple feia aparèixer un formulari indicant que es procedia a reiniciar l’ordinador en cas que no es digués res en uns segons, en cas contrari es podia retrassar el reinici 5 minuts per poder guardar la feina i que no afectés a l’usuari.

Però com es generen aquests formularis? Picant codi i afegint-lo a la capçalera del nostre script, però els bons senyors de POSHGUI (https://poshgui.com/) ens ofereixen una funció més WYSIWYG per tant desenvolupar millor aquests formularis. Un cop acabat, podem indicar quins funcions cridaran alguns events (per exemple click a un botó) i poder escriure codi. Al acabar podem copiar al portapapers, guardar en TXT o en PS1 la feina feta. Per descomptat podem guardar de forma privada o pública la nostra feina a la mateixa web.

» Read more

Bots de Telegram des del shell de linux/mac i powershell

Tocatejant un codi fet amb C# he vist que al acabar enviava un missatge per un bot de telegram. He trobat ridiculament senzill així que he dicidit buscar els diversos modes per poder fer-ho des de batch scripts.

Bàsicament el que fem és cridar una URL adjuntant uns POST, aquests post enviarem el text del missatge, enviarem per formatar el text (negreta, cursiva) i l’identificador de chat.

Si no sabeu com trobar l’identificador dedueixo que encara no heu creat el vostre Bot i, per tant, tampoc teniu el token per poder comunicar amb ell. Així doncs passem a explicar com aconseguir-los:

Gran part d’aquesta documentació la trobeu al lloc oficial: https://core.telegram.org/bots#botfather

En aquest lloc que acabo de mencionar tenim un link al botfather (un acudit amb “El padrino” “The Godfather”) en la que ens diuen que li obrim un xat per tal d’obtenir mes informació: https://telegram.me/botfather

Un cop obert, presionem start (com solen funcionar els bots a telegram) i utilitzem o fem click a /newbot per tal de comenar el procés i obtenir el nostre bot. Primer ens preguntarà quin nom volem que tingui el nostre Bot, el que sortirà representat ens els xats i llavors, ens demanarà quin nom d’usuari tindrà. Com que tots som molt espavilats i segurament creem elmeunickbot, suggereix que el nom d’usuari sigui elmeunick_bot però, en el meu cas ha fallat però això són figues d’un altre paner.

Un cop li hem donat els noms, ens assigna un token i ens recorda la importància d’aquests, que el guardem ben guardat i que no el perdem. Falta rès? Clar que sí, falta l’identificador de xat i per això abans hem d’iniciar un xat amb el nostre bot. En l’últim missatge de @botfather ens facilita també el link per obrir el xat t.me/elmeunick_bot (o el que us hagi acceptat…), al igual que amb els altres bots, prenem start (o enviem /start) i ja tindrem un xat obert amb ell. Ara toca obtenir l’odentificador i tindrem que anar al navegador i posar la següent direcció:

https://api.telegram.org/botelvostretoken/getUpdates

ULL! Si sou vius no cal que us aviso, però per si a un cas aneu amb embranzida i ja ewsteu fent copia i enganxa, heu de substituir elvostretoken per el token que us ha donat @botfather!

Un cop fet, us retorna una cadena de text Json (utilitzeu el visualitzador que mes us agradi) i localitzem l’entrada “chat” i el seu valor “id”:

"chat": {
  "id": 123456789,
  "first_name": "Pere Porter",
  "username": "perebotero",
  "type": "private"
}

En l’exemple que us poso, serà “123456789”, un cop ja tenim el token i l’identificador, sols caldà modificar els scripts per tal que funcionin al vostre gust. En tot cas, fem una dissecció del que hem de fer per tal d’enviar un missatge.

Com us he dit enviarem un POST DATA junt a la crida de la URL i podem fer-ho de diverses maneres, la més senzilla i ràpida, és en la mateixa adreça:

http://www.kamencesc.com/test?post1=valor&post2=23

Les dades que enviem son:

  • post1 amb un valor de text “valor”
  • post2 amb un valor numèric de 23

L’altre forma és identificant a part aquests valors, us presento els dos casos en tres scripts diferents.

Powershell

$MyToken = "987654321:AAFYBL1Q9vNBceeAJNDLNkRaFUaq5pVnqkc"
 $chatID = 123456789
 $Message = "Missatge des de ***Powershell***"
$Parse_mode = "Markdown"
 $Response = Invoke-RestMethod -Uri "https://api.telegram.org/bot$($MyToken)/sendMessage?chat_id=$($chatID)&parse_mode=$($Parse_mode)&text=$($Message)"

Executem l’script canviant les nostres dades al gust i ja tindrem el nostre missatge en el xat. Així de puntetes, passem pel parse_mode que és el que ens permet fer servir negreta (amb el *** [tres estariscos] al principi i final del que volem posar en negreta) o en cursiva (amb ___ [tres guions baixos] al principi i final). Us deixo un enllaç a la documentació ja que hi ha més opcions per poder utilitzar fins i tot codi html.

https://core.telegram.org/bots/api#formatting-options

Linux – wget

chat_id="123456789"
token="987654321:AAFYBL1Q9vNBceeAJNDLNkRaFUaq5pVnqkc"
bot_text="Missatge des de linux amb ***wget***"
wget --post-data="chat_id=$chat_id&parse_mode=Markdown&text=$bot_text" https://api.telegram.org/bot$token/sendMessage

Com podeu veure, aqui indiquem la POST DATA amb anterioritat i no enganxat amb la URL com el cas del Powershell, però el resultat és el mateix.

Linux – curl

 chat_id="123456789"
token="987654321:AAFYBL1Q9vNBceeAJNDLNkRaFUaq5pVnqkc"
bot_text="Missatge des de linux amb ***wget***"
curl -s -X POST https://api.telegram.org/bot$token/sendMessage -d chat_id=$chat_id -d pase_mode="Markdown" -d text="$bot_text" > /dev/null

En el cas de curl, indicarem cada POST DATA amb -d nom=valor totes per separat. Finalment, per tal de no obtenir un valor de resposta, posetm direccionem la sortida cap a /dev/null (recordeu treure això si esteu testejant i no us arriba el missatge).

Aquests són les tres formes que podem trobar per enviar missatges al nostre bot des batch scripting amb shell i powershell, per tant Linux (necesitem wget o curl), Mac (necessitem wget o curl)i Windows.

Espero que us serveixi, és ideal per fer crides des de crontab cada x temps amb valors de lectura amb una raspberry pi per exemple, o al finalitzar scripts rutinaris i rebre un petit informe al final d’aquests.

En un altre post mirarem com enviar documents! Estigueu al cas!

Canvi de dispositius d’audio amb PowerShell (2)

He actualitzat l’script per canviar de dispositius degut a un problema amb els anteriors.

Sembla que els dispositius “canvien” d’ordre donades algunes sircumstàncies, i per tant l’script anterior basat en l’ordre en que llistàvem els dispositius ja no serveix, per tant, toca automatitzar una mica l’script.

La idea es llistar els dispositius, filtrar els que interessen i activar el que necessitem i la mateixa comanda que varem utilitzar per llistar tots els dispositius ens servirà.

Get-AudioDevice -List

Per poder treballar amb ells la posarem en una variable i ja que hi sóm, farem una taula sols amb les dades que ens interessen. En aquest cas l’Index i Name.

$llista = Get-AudioDevice -List | Select Index, Name

El següent serà recorre la llista per poder saber quin dispositiu hem d’activar, per tant ens falten 2 coses, un nom amb el que comparar i el número index+1.

$disp1 = "BenQ PD2500Q (NVIDIA High Definition Audio)"
$disp =  "Altavoces (Realtek High Definition Audio)"

$llista = Get-AudioDevice -List | Select Index, Name

Foreach($i in $llista)
{
$nom = $i.Name
$in = $i.Index + 1
if ( $nom -like $disp )
{
Set-AudioDevice -Index $in
}
}

Veureu que utilitzar Select ens permet accedir molt fàcilment al les columnes de la taula $var.NomCol i que tal com varem fer en l’script anterior, sumem 1 a l’index de la taula. Ara sols ens queda una cosa, dir quin dispositiu volem activar ja que ara sols activaria $disp que són els auriculars.

Podriem fer dos scripts, però en aquest cas utilitzarem $Args i passarem un valor, en cas de no passar res activara els auriculars.

$disp1 = "BenQ PD2500Q (NVIDIA High Definition Audio)"
$disp =  "Altavoces (Realtek High Definition Audio)"

if ($Args -eq 'benq')
{
$disp = $disp1
}

$llista = Get-AudioDevice -List | Select Index, Name

Foreach($i in $llista)
{
$nom = $i.Name
$in = $i.Index + 1
if ( $nom -like $disp )
{
Set-AudioDevice -Index $in
}
}

Ara si passem el paràmetre ‘benq’ a l’hora de cridar l’script activarà l’audio del monitor. Per mi ja estaria OK, però podriem expremer una mica mes l’script i ja que definim els dos dispositius, podem recorrer la taula i mitjançant el camp Default, quedant un Script com aquest.

$disp1 = "BenQ PD2500Q (NVIDIA High Definition Audio)"
$disp =  "Altavoces (Realtek High Definition Audio)"

$llista = Get-AudioDevice -List | Select Index, Name, Default

Foreach($i in $llista)
{
$nom = $i.Name
$in = $i.Index + 1
if ( $nom -like $disp )
{
if ( $i.Default -like 'False' )
{
Set-AudioDevice -Index $in
exit
}
}
if ( $nom -like $disp1 )
{
if ( $i.Default -like 'False' )
{
Set-AudioDevice -Index $in
exit
}
}
}

És important acabar l’script un cop cambiem el dispositiu ja que si es canvia el primer, podem tornar a activar el segón.

I feina feta, jo em quedo amb l’script anterior ja que tinc un botó per cada cosa en l’Stream Deck però si mai tinc que reduir l’espai dels botons ja tinc l’altre.

Monitor en mode Estalvi d’energia amb PowerShell

Seguint amb les ulilitats que pot donar el meu Stream Deck de Elgato i que anteriorment ja n’he parlat sobre treure profit amb Powershell.

Canvi de dispositius d’audio amb PowerShell

Com alguns podeu saber, el meu escriptori és el terra, tinc el meu setup (monitors, stream deck, micro, etc) tot al terra davant la TV i moltes vegades em passa que vull veure la TV inmediatament i tinc que tancar els monitors perquè no molestin, així que vaig pensar que potser amb PowerShell podría fer-ho.

Una cerca ràpida per google em va portar a Windows Tip: 4 Different Ways to Turn Off Desktop Monitor or Laptop Screen ón expliquen entre altres coses, una crida amb un script de PowerShell.

Copiar i enganxar i l’script funciona perfectament, configuro tal i com vaig fer amb els altre botons de l’Stream Deck i els monitors entren en estalvi d’energia, l’únic inconvenient és que la finestra de PowerShell queda oberta i no m’interessa, molesta trobarla oberta al despertar els monitors.

function Set-DisplayOff
{
	$code = @"
	using System;
	using System.Runtime.InteropServices;
	public class API
	{
		[DllImport("user32.dll")]
		public static extern
		int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
	}
	"@
	$t = Add-Type -TypeDefinition $code -PassThru
	$t::SendMessage(0xffff, 0x0112, 0xf170, 2)
}

Set-DisplayOff

Una mica més investigació m’ha portat a descobrir que a part de SendMessage existeix PostMessage, que és dintre de la API Win32 la versió asincrona de SendMessage i per tant no interfereix en el fil d’execució.

Així que el codi de l’script final queda tal que:

function Set-DisplayOff
{
	$code = @"
	using System;
	using System.Runtime.InteropServices;
	public class API
	{
		[DllImport("user32.dll")]
		public static extern
		int PostMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
	}
	"@
	$t = Add-Type -TypeDefinition $code -PassThru
	$t::PostMessage(0xffff, 0x0112, 0xf170, 2)
}

Set-DisplayOff

Canvi de dispositius d’audio amb PowerShell

Després de comprar l’Stream Deck de Elgato li trobava a faltar la manera de poder canviar entre dispositius d’àudio en calent.

Les investigacions em varen portar cap a PowerShell però de sèrie no pot fer aquestes funcions (que sàpiga) però si amb aquesta extensió que vaig trobar a github:

AudioDeviceCmdlets: https://github.com/frgnca/AudioDeviceCmdlets

Amb ella podem llistar els dispositius (tant de reproducció com de gravació) i poder canviar-lo, a part de canviar valors com el volum, etc.

Amb aquesta comanda llistem els dispositius

PS C:\Users\User> Get-AudioDevice -list

Index : 1
Default : False
Type : Playback
Name : Altavoces (Steam Streaming Microphone)
ID : {0.0.0.00000000}.{1a5fae48-a964-4d5a-ba5c-509e63ea6afd}
Device : CoreAudioApi.MMDevice

Index : 2
Default : True
Type : Playback
Name : Altavoces (Realtek High Definition Audio)
ID : {0.0.0.00000000}.{265fcc99-7fa6-4fa2-97bf-93236b4a1391}
Device : CoreAudioApi.MMDevice

Index : 3
Default : False
Type : Playback
Name : BenQ PD2500Q (NVIDIA High Definition Audio)
ID : {0.0.0.00000000}.{45ef6901-5ee0-4752-a0d9-d2fad76fe12c}
Device : CoreAudioApi.MMDevice

Index : 4
Default : False
Type : Playback
Name : Altavoces (Steam Streaming Speakers)
ID : {0.0.0.00000000}.{5deb3169-df93-4c68-b73d-a576584badc6}
Device : CoreAudioApi.MMDevice

Index : 5
Default : False
Type : Recording
Name : Línea de entrada (Realtek High Definition Audio)
ID : {0.0.1.00000000}.{17278a24-459b-4768-b332-b553a81ec097}
Device : CoreAudioApi.MMDevice

Index : 6
Default : False
Type : Recording
Name : Micrófono (Steam Streaming Microphone)
ID : {0.0.1.00000000}.{1bd0aa36-eedd-48a6-a9a5-404e80a7bc14}
Device : CoreAudioApi.MMDevice

Index : 7
Default : True
Type : Recording
Name : Micrófono (HD Pro Webcam C920)
ID : {0.0.1.00000000}.{2831395a-a41e-4285-9078-cb3558e5a024}
Device : CoreAudioApi.MMDevice

Necessitem l’Index al que volem canviar i podem canviar llençant aquesta comanda:

Set-Audiodevice -Index <yournumber>

Amb aquesta comanda ja tindrem canviat el dispositiu, però, com ho podem cridar? Si intentem cridar directament un fitxer d’script ens trobem que no tenim permisos per executar el (nostre propi) script, que per cert, són amb extensió ps1.

Tenim dos opcions, autoritzar TOTS els permisos i per tant no tenir problemes, o per altre part cridar powershell.exe amb alguns comandament extra quan cridem l’script.

powershell -executionPolicy bypass -file "c:\path\to\file\haedphones.ps1"

Amb això saltem els permisos d’execució de l’script… ehm… sí… amb aquesta comanda i jasta, seguretat a tope a powrshell si pots llançar powrshell des de linia de comandes… “hurra”

Evidentment tindrem que fer un altres script per tornar al dispositiu anterior, “obvious”.

Espero que us hagi servit ;)

1 2