Nei giorni scorsi mi è stato chiesto di tenere sotto controllo la linea di un utente durante tutta la sua giornata lavorativa per capire se era veloce e stabile. Me lo sono cavata mandando in esecuzione uno script che eseguiva un ping -t verso un sito aziendale e vedendo così che la linea era poco veloce e molto instabile. Ma se volessi fare uno speedtest, ripeterlo più volte ed avere un report dei test?
Quello che ci serve è SpeedTest Cli di Ookla disponibile per Windows, macOS, Linux e Free BSD.
Speedtest
Una volta scaricato l’archivio zippato dal sito ed estratti i due file al suo interno, apriamo PowerShell (i primi due esempi li potremmo avviare anche dal prompt dei comandi) e possiamo utilizzare queste tre versioni di SpeedTest:
In questo modo eseguiamo uno speedtest ed il suo risultato viene salvato nel file d:\speedtest.txt. Se ripetiamo lo script il file di testo viene sovrascritto e perdiamo il vecchio risultato del test. d:\speedtest.exe --accept-license --progress=no --output "d:\speedtest.txt"
Con lo script seguente possiamo eseguire quanti speedtest vogliamo, magari pianificando l’esecuzione dello script di PowerShell, e i vari risultati vanno a sommarsi sempre nel file d:\speedtest.txt. d:\speedtest.exe --accept-license --progress=no --output >> "d:\speedtest.txt"
Se vogliamo avere la data e ora di esecuzione dei test, direttamente nel file di testo senza andare a consultare le pagine Web dei risultati, dobbiamo ricorrere a questo script.
d:\speedtest.exe --accept-license --progress=no --output >> "d:\speedtest.txt"
$report = "d:\SpeedTest.txt"
$dateFormat = "dd-MM-yyyy HH:mm:ss"
(Get-Date).ToString($dateFormat) | Out-File -FilePath $report -Append:$true
Get-Content -Path $report
Il risultato sarà qualcosa di simile a questo, oltre alle velocità registrate della linea ci sarà anche il link della pagina web da consultare.
Se vogliamo (per curiosità più che altro) vedere uno speedtest diverso dal solito, anche nel report finale, possiamo utilizzare questa stringa di comando d:\speedtest.exe -p -v | Out-File d:\net_speed.txt
. Durante le prove fatte ho visto che genera alcuni warning e messaggi vari.
Usare server diversi
mi veniva sempre assegnato un server di Montecchio Maggiore, che è piuttosto distante da casa mia, utilizzando l’opzione -servers, d:\speedtest.exe -servers
, possiamo vedere quali sono gli altri server nelle nostre vicinanze.
Aggiungendo l’opzione --server-id=xxxxx al comando possiamo eseguire il test sul server che abbiamo scelto noi.
d:\speedtest.exe --server-id=28046 --accept-license --progress=no --output "d:\speedtest.txt"
Download e avvio test
Gli script visti sino ad ora prevedevano che noi scaricassimo l’eseguibile di Speedtest.exe e lo mettessimo in una cartella a nostra scelta, ora invece andiamo a scaricare e scompattare l’archivio tramite lo script.
Potete ovviamente personalizzare i percorsi di salvataggio ed estrazione dei file, oltre alla posizione del file di report.
Il $DownloadURL potrebbe cambiare se viene aggiornata la versione del programma, in caso controllate nella pagina ufficiale del programma il nuovo link.
#https://www.speedtest.net/apps/cli
cls
$DownloadURL = "https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-win64.zip"
#Posizione dove salvare il file scaricato
$DownloadPath = "d:\SpeedTest.Zip"
#Posizione dove estrarre il file scaricato
$ExtractToPath = "d:\SpeedTest"
$SpeedTestEXEPath = "d:\SpeedTest\speedtest.exe"
#Posizione del file di log
$LogPath = 'd:\SpeedTestLog.txt'
#avvio del test
$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continua"
Start-Transcript -path $LogPath -Append:$true
function RunTest()
{
$test = & $SpeedTestEXEPath --accept-license
$test
}
#Controllo se il file esiste
if (Test-Path $SpeedTestEXEPath -PathType leaf)
{
Write-Host "SpeedTest.exe esiste, avvio il test" -ForegroundColor Green
RunTest
}
else
{
Write-Host "SpeedTest.exe non esiste, avvio il suo download"
#scarico il file
Invoke-WebRequest $DownloadURL -outfile $DOwnloadPath
#scompatto il file Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
param([string]$zipfile, [string]$outpath)
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
}
Unzip $DownloadPath $ExtractToPath
RunTest
}
# registro il nome del computer
$Hostname = hostname
#fine test
Stop-Transcript
exit 0