Hybrid Code with SpeedTest CLI by Ookla

Discussion forum for all Windows batch related topics.

Moderator: DosItHelp

Post Reply
Message
Author
Hackoo
Posts: 103
Joined: 15 Apr 2014 17:59

Hybrid Code with SpeedTest CLI by Ookla

#1 Post by Hackoo » 24 Dec 2022 13:12

Hi :wink:
SpeedTest_Hackoo_Ookla.bat
I want to share with you this beta version of SpeedTest CLI with Hybrid code Batch-Powershell for testing and optimize it for any bugs.

Code: Select all

<# : Batch Script Section
@rem # The previous line does nothing in Batch, but begins a multiline comment block in PowerShell. This allows a single script to be executed by both interpreters.
@echo off
Title SpeedTest Script Written by Hackoo And Powered by Ookla 2022 & Mode 100,25
@REM OPEN CMD WINDOW MAXIMIZED
@REM IF NOT "%1"=="MAX" START /MAX CMD /D /C "%~0" MAX & GOTO :EOF
cd "%~dp0" & echo %~nx0>"%temp%\MyScriptName.txt"
Color 1B & echo( & Echo(
Echo(                       Please Wait ... Loading script is in Progress ...
Powershell -executionpolicy bypass -Command "Invoke-Expression $([System.IO.File]::ReadAllText('%~f0'))"
EndLocal
pause
goto:eof
#>
# Powershell Script Section begin here...
# Here we execute our powershell commands...
cls
# https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-win64.zip
Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
    param([string]$zipfile, [string]$outpath)
    [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
}
if($OS_Architecture -eq 'x86')
{
    write-host 'Your System is 32-bit. Sorry ! This Program is incompatible under this System !' -fore Red
    break
}
else
{
    ############# Playing Music in Background just for relax and have fun #################
    Add-Type -assemblyName PresentationFramework
    Function Start-Music {
        $code = {
            $Radios_Stations_Array = @(
            "http://retro.dancewave.online/retrodance.mp3",
            "http://www.leeholmes.com/projects/ps_html5/background.mp3",
            "http://radio.mosaiquefm.net:8000/mosagold",
            "http://radio.mosaiquefm.net:8000/mosadj",
            "https://stream.initialradio.fr:8443/djbuzz-192k.mp3",
            "http://audio1.maxi80.com"
            )
            $MyShuffledList = $Radios_Stations_Array | Sort {Get-Random}
            $url = $MyShuffledList[1]
            $player = New-Object -ComObject 'MediaPlayer.MediaPlayer'
            $player.Open($url)
            $player
        }
        $script:ps = [PowerShell]::Create()
        $script:player = @($ps.AddScript($code).Invoke())[0]
    }
    #######################################################################################
    Function Stop-Music
    {
        if ($script:player -ne $null)
        {
            $script:player.Stop()
            Remove-Variable -Name player -Scope script
        }
        if ($script:ps -ne $null)
        {
            $script:ps.Runspace.Close()
            $script:ps.Dispose()
            Remove-Variable -Name ps -Scope script
        }
    }
    ###############################################################################################
    # Starting to play music while executing the script
    Write-Host " Please Wait a while ... SpeedTest is in progress ..." -Fore Yellow
    Start-Music
    $start_time = Get-Date
    ###############################################################################################
    $Title                      = "SpeedTest Script Written by Hackoo And Powered by Ookla 2022"
    $ErrorActionPreference      = "SilentlyContinue"
    $Zip_URL                    = "https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-win64.zip"
    $Zip_File                   = "$env:TEMP\speedtest.zip"
    $ExtractPath                = "$env:TEMP\SpeedTest"
    $SpeedTest_EXE              = "$ExtractPath\speedtest.exe"
    ######################### Create A Shortcut to this Script on Desktop #########################
    $MyScriptName               = GC "$Env:Temp\MyScriptName.txt"
    $MyPath                     = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($pwd,"$MyScriptName"))
    $WshShell                   = New-Object -comObject WScript.Shell
    $Shortcut                   = $WshShell.CreateShortcut("$Home\Desktop\SpeedTest.lnk")
    $Shortcut.TargetPath        = "$MyPath"
    $Shortcut.IconLocation      = "$SpeedTest_EXE"
    $Shortcut.WorkingDirectory  = "$([System.IO.Path]::GetFullPath([System.IO.Path]::Combine($pwd,'')))"
    $Shortcut.Description       = "$Title"
    $Shortcut.HotKey            = "CTRL+ALT+S"
    $Shortcut.Save()
    ###############################################################################################
    # Check if file does not exists , we download and unzip it
    if (-not(Test-Path -Path "$Zip_File" -PathType Leaf)) {
        Try{$Download = (New-Object System.Net.WebClient).DownloadFile("$Zip_URL","$Zip_File")}
        catch {write-host "$_.Exception.Message" -fore Red;Stop-Music;Break;}
        unzip "$Zip_File" "$ExtractPath"
    }
    # Check if file SpeedTest.exe does exists
    if (Test-Path -Path "$SpeedTest_EXE" -PathType Leaf) {
        $Speedtest = & "$SpeedTest_EXE" --format=json --accept-license --accept-gdpr
        $Speedtest | Out-File "$ExtractPath\Last.txt" -Force
        $Speedtest = $Speedtest | ConvertFrom-Json
    }
    [PSCustomObject]$SpeedObject = @{
        SSID          = (get-netconnectionProfile).Name
        ComputerName  = $($env:computername)
        UserName      = $($env:username)
        TimeStamp     = Get-Date -F "dd/MM/yyyy HH:mm:ss" $Speedtest.timestamp
        Downloadspeed = [math]::Round($Speedtest.download.bandwidth / 1000000 * 8, 2)
        Uploadspeed   = [math]::Round($Speedtest.upload.bandwidth / 1000000 * 8, 2)
        Packetloss    = [math]::Round($Speedtest.packetLoss)
        ISP           = $Speedtest.isp
        Location      = $Speedtest.server.location
        Country       = $Speedtest.server.Country
        ExternalIP    = $Speedtest.interface.externalIp
        InternalIP    = $Speedtest.interface.internalIp
        MACAddr       = $Speedtest.interface.macAddr
        VPN           = $Speedtest.interface.isVpn
        ServerName    = $Speedtest.server.name
        UsedServer    = $Speedtest.server.host
        URLResult     = $Speedtest.result.url
        Jitter        = [math]::Round($Speedtest.ping.jitter)
        Latency       = [math]::Round($Speedtest.ping.latency)
    }
    cls
    $LogFile = $($SpeedObject.SSID)+"_"+$($env:computername)+"_"+$($env:username)+"_"+"SpeedTest_Results.txt"
    $SpeedObject | ConvertTo-Json | Out-File ".\$LogFile" -Append
    $SpeedObject
    $Elapsed_Time = "$((Get-Date).Subtract($start_time).Minutes) Minutes(M) : $((Get-Date).Subtract($start_time).Seconds) Secondes(s)"
    $shell = new-object -comobject "WScript.Shell"
    $Answer = $shell.popup("Running Script Time Taken is : $Elapsed_Time `r`nDo you want to launch the result with your default browser ?",0,"$Title",4+32+4096)
    If ($Answer -eq 6) {
        Write-Host "OK We are Starting the result with your default browser !" -ForegroundColor Yellow -BackgroundColor Blue
        ii ".\$LogFile"
        Start $SpeedObject.URLResult
        $PS_Version=$PSversionTable.PSVersion.Major
        If ($PS_Version -ge 2) {$SpeedObject | OGV -Title $Title -Wait}     
    }
    else {
        Write-Host "Script Aborted !" -ForegroundColor Yellow -BackgroundColor Blue
        ii ".\$LogFile"
    }
    Stop-Music
}

Post Reply