SwapByte Powershell Script
Fa uns mesos vaig començar a portar aquesta eina a Powershell, la podeu trobar per Mac aquí al blog, però vaig trobar interessant poder fer-la en Powershell, era quan estava fent probes amb els formularis.
Com que ja haviem vist com funcionen els formularis en Powershell, comentaré simplement novetats en el codi.
La primera de tota són les funcions Get-FileName i Set-FileName, que ens obren els diálegs de Obrir i Guardar fitxers respectivament. El resultat el posarem directament en una caixa de text, així estalviem variables.
# File to read
Function Get-FileName($initialDirectory)
{
[System.Reflection.Assembly]::LoadWithPartialName(“System.windows.forms”) |
Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = “All files (*.*)| *.*”
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
} #end function Get-FileName
Les dues funcions son pràcticament iguals, simplement en una cridem a System.Windows.Forms.OpenFileDialog i a l’altre System.Windows.Forms.SaveFileDialog.
La funció de Swap la fem tota en memòria, presuposem que els equips d’avui en dia no tenen problemes i es carrega tot el fitxer (byte a byte) en una variable, llegirem els elements de dos en dos (utilitzat un FOR i increment de +2). Dintre del FOR simplement desem en una variable temporal el primer byte (HIGH si parlem de 16bits), llavors el segon byte (LOW) el copiem a la posició del primer i per acabar copiem la variable temporal (HIGH) a la posició antiga del LOW.
Function doSomething() {
$ProgressBar1.value = 0
# Read the entire file to an array of bytes.
$bytes = [System.IO.File]::ReadAllBytes($sourcePath.text)
# Get number of bytes
$size = $bytes.count
# Let's do a for loop over all bytes, itineration is +2 so we read 8+8 and then swap
for ($i=0; $i -le $size-1; $i=$i+2) {
# Save HIGH bytes
$temp_byte = $bytes[$i]
# Copy LOW bytes to HIGH position
$bytes[$i] = $bytes[$i+1]
# Copy HIGH bytes to LOW position
$bytes[$i+1] = $temp_byte
# Drawing the ProgressBar
$ProgressBar1.value = ( $i / $size ) * 100
}
# Write the file
[System.IO.File]::WriteAllBytes($destinationPath.text, $bytes)
# Message, work is done
[System.Windows.MessageBox]::Show('Done')
}
També s’ha inclòs una barra de progrés, que omplirem a mesura que anem processant la variable. Al saber la mida d’aquesta és una feina fàcil i neta.
Desem la variable en el fitxer de destí i per acabar surt una caixa de text que ens indica que la feina s’ha acabat.