Speedtest.net automatisierter Langzeittest

Download

Ich hatte in letzter Zeit immer wieder Probleme mit meinem Internetprovider. In relativ regelmäßigen Abständen fiel das Internet aus, und somit auch das Telefon aufgrund von VoIP. Der bereitgestellte All-in-one Router des Providers loggt natürlich nicht vernünftig, somit musste ich nach einer anderen Lösung suchen.

Nach einigen Überlegungen bin ich auf die Idee gekommen über die Powershell einen Speedtest durchzuführen. Somit sehe ich nicht nur die Ausfälle, sondern auch die aktuelle Geschwindigkeit. Daraufhin habe ich im Internet nach Lösungen gesucht und fand auch eine:

https://www.powershellgallery.com/packages/Speedtest/2.0

Jetzt musste ich nur noch für die Dokumentation bzw. Logging sorgen. Dazu habe ich folgendes Skript erstellt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$time = (Get-Date).ToString()
$path = [Environment]::GetFolderPath([System.Environment+SpecialFolder]::Desktop).ToString()
$name = "Speedtest Download"
 
    function write-csv ($Inhalt)
    {
        $FileExists = Test-Path $path\$name.csv
        $FileInp = $time + ';' + $Inhalt + ';' + "Mbit/Sec" 
 
        If ($FileExists -eq $True)
        { 
            Add-Content $path\$name.csv -value $FileInp
        } 
        else 
        {
            New-Item $path\$name.csv -type file 
            Add-Content $path\$name.csv -value "Datum;Downloadspeed;Einheit"
            Add-Content $path\$name.csv -value $FileInp
        }
    }
 
$Speedtest = $Speedtest.trim("Wan Speed is ? Mbit/Sec")
$Speedtest = $Speedtest.Replace(".",",")
write-csv ($Speedtest)

Bröseln wir das mal ein bisschen auf.

  1. Ich habe erstmal ein paar Variablen definiert die ich in den Anweisungen brauche:
    1
    2
    3
    
    $time = (Get-Date).ToString()
    $path = [Environment]::GetFolderPath([System.Environment+SpecialFolder]::Desktop).ToString()
    $name = "Speedtest Download"
    1. Hier habe ich mir die aktuelle Zeit geholt, die brauche ich für das Logfile.
    2. Zudem habe ich den Speicherpfad der Datei festgelegt. Hier habe ich den Desktop des aktuellen Benutzers genommen, da es diesen Ordner auf jedem System gibt und ich somit keine Prüfung einbauen muss. Zudem sollte der Benutzer das Ergebnis ohne viel suchen finden.
    3. Als letztes habe ich mir den Namen des Logfiles in eine Variable gesetzt, damit er einfach anzupassen ist.
  2. Danach habe ich eine Funktion geschrieben, die für das Logging verantwortlich ist:
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
        function write-csv ($Inhalt)
        {
            $FileExists = Test-Path $path\$name.csv
            $FileInp = $time + ';' + $Inhalt + ';' + "Mbit/Sec" 
     
            If ($FileExists -eq $True)
            { 
                Add-Content $path\$name.csv -value $FileInp
            } 
            else 
            {
                New-Item $path\$name.csv -type file 
                Add-Content $path\$name.csv -value "Datum;Downloadspeed;Einheit"
                Add-Content $path\$name.csv -value $FileInp
            }
        }
    1. Als erstes wird eine Variable erstellt um zu überprüfen ob das Logfile bereits existiert.
    2. Danach wird die Variable für die Logzeile zusammengesetzt. Hierfür benutze ich die aktuelle Zeit, den Inhalt der Funktion und die Einheit. Die Werte werden durch ein ; getrennt, damit Excel die Zellen voneinander unterscheiden kann.
    3. Jetzt folgt die Prüfung ob das Logfile vorhanden ist. Wenn ja schreibt er die Zeile in das bestehenden Dokument. Wenn nicht erstellt er ein neues Dokument im angegebenen Pfad mit angegebenen Namen. Danach werden die Spaltenüberschriften geschrieben. Zuletzt werden die Werte eingetragen.
  3. Der Letzte Schritt ist nur noch Formatierung
    22
    23
    24
    
    $Speedtest = $Speedtest.trim("Wan Speed is ? Mbit/Sec")
    $Speedtest = $Speedtest.Replace(".",",")
    write-csv ($Speedtest)
    1. Als erstes wird die Ausgabe des Scripts angepasst, indem „Wan Speed is“ und „Mbit/Sec“ aus der Variable entfernt werden. Das mache ich damit in der Zelle nur ein Zahlenwert steht.
    2. Danach wird der Dezimaltrenner geändert, denn das System gibt den Wert mit „.“ getrennt aus.
    3. Als letztes wird der Wert in die CSV bzw. das Log geschrieben.

Zuerst war mein Ansatz, dass ich die Speedtest.ps1 unberührt lasse. Leider ging das nicht, da der Ausgabewert des Scripts mit Write-Host umgesetzt wurde. Somit hat er mir immer die Fehlermeldungen mit in den String gehauen. Trotz Fehlermeldung hat das Skript jedoch gemacht was es sollte. Somit habe ich es angepasst und in meins implementiert.

Automatisierung

Die Automatisierung realisiere ich durch die Windows Aufgabenplanung.

Den Trigger habe ich so eingestellt, das die Aufgabe eine Woche lang jede Stunde ausgeführt wird.

Trigger Aufgabe Speedtest.net Langzeittest
Trigger Aufgabe Speedtest.net Langzeittest

Bei der Aktion ist die Windows Powershell als Programm anzugeben.
Weil in Windows die Ausführung von PowerShell Skripten aus Sicherheitsgründen unterbunden wird, muss man eine temporäre Erlaubnis erstellen. Das erreicht man mithilfe des Agruments -ExecutionPolicy Bypass. Zudem muss auch der Pfad zur .ps1 Datei enthalten sein, dieser wird mit -file „“ angegeben.

  • Programm/Skript: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  • Argument: -ExecutionPolicy Bypass -file „[Pfad zur .ps1]“
Aktion Speedtest.net Langzeittest
Aktion Speedtest.net Langzeittest

Damit die Ergebnisse nicht verfälscht werden, sollte der Test von einem PC ausgeführt werden, der per Kabel direkt am Router hängt.

Download

Dieser Beitrag hat 4 Kommentare

  1. Hallo,
    das habe ich gerade gut gebraucht.
    Wie müsste der Code verändert werden, damit ich auch den Ping und den Upload loggen kann?

    Grüße

    1. Hi Andreas,

      der Teil der für das Messen zuständig ist, ist nicht von mir sondern von velecky@velecky.onmicrosoft.com. Ich habe seid der Veröffnetlichung versucht zu verstehen wie das Skript funktioniert, doch leider sind meine PowerShell kenntnisse dafür nicht ausreichend. Ich Versuche weiterhin den Ping und den Upload einzubinden. Falls ich erfolg habe gebe ich natürlich bescheid 🙂

      Grüße

  2. Hallo Jonas,
    ich bin auf der Suche nach einem Langzeitspeedtest auf deine Seite aufmerksam geworden, habe aber auch das Problem, dass der Ping für mich relevant wäre. Habe mir mal die Speedtest.net App runtergeladen und hab mir gedacht, dass man hier ja lediglich die Interaktion mit der „Los“ -Taste irgendwie automatisch steuern müsste. Leider hab ich nicht die nötigen Fachkenntnisse, aber evtl. hast du ja einen Idee?

    Liebe Grüße

    1. Hi Oscar,
      hat leider ein bisschen gedauert (Abistress…) :’D

      Die Idee hatte ich auch. Die App öffnen über Powershell ist kein Problem:
      Start-Process „explorer.exe“ -ArgumentList („shell:AppsFolder\“ + (Get-StartApps | where AppID -like „*speedtest*“).AppID)
      Bis jetzt habe ich aber noch keine Möglichkeit gefunden über das Skript auf Start zu drücken, oder die App mit startbefehl zu starten.

      Ich bleib dran
      Liebe Grüße

Schreibe einen Kommentar

Jonas Hagendorf

Ich bin Jonas Hagendorf, 19 Jahre alt. Zurzeit gehe ich in die 13. Klasse einer Gesamtschule und mache dort mein Abitur.Mein Ziel ist nach dem Abitur ist eine Ausbildung zum Fachinformatiker für Systemintegration zu machen und wenn möglich anschließend IT zu studieren. Über mich: https://blog.jonashagendorf.de/about-me/