Auto-Shutdown Computer nach einem Upload

Wer kennt es nicht im Internet Neuland Land Deutschland, das Internet ist wieder viel zu lam aber man hat noch 10GB die man hochladen will. Also lässt man den PC wieder über Nacht den Upload ausführen, da man am Tag selbst dieses Internet braucht. Also feuert die Büchse die ganze Nacht den Stromzähler an. Um dies nun etwas ökonomischer zu gestalten habe ich mich vor Kurzen mal in die Tiefen des Internets bewegt, um einen Autoshutdown auf Basis der Netzwerkauslastung zu finden. Ein Teil der Lösung konnte ich recht schnell hier finden. Dieses Skript kann einem helfen die Durchschnittliche-Auslastung über einen definierten Zeitraum zu finden. Ich habe mir dieses Skript in eine Funktion umgebaut so dass ich dieses flexible Aufrufen kann:

function Get-Bandwidth {
    [CmdletBinding()]
    param (
        # TimeSpan in secounds
        [Parameter(Mandatory = $false)]
        [int]
        $SampleInterval = 5
    )
    $startTime = get-date
    $endTime = $startTime.AddSeconds($SampleInterval)
    $timeSpan = new-timespan $startTime $endTime

    $count = 0
    $totalBandwidth = 0

    while ($timeSpan -gt 0) {
        # Get an object for the network interfaces, excluding any that are currently disabled.
        $colInterfaces = Get-WmiObject -class Win32_PerfFormattedData_Tcpip_NetworkInterface | Select-Object BytesTotalPersec, CurrentBandwidth, PacketsPersec | Where-Object { $_.PacketsPersec -gt 0 }

        foreach ($interface in $colInterfaces) {
            $bitsPerSec = $interface.BytesTotalPersec * 8
            $totalBits = $interface.CurrentBandwidth

            # Exclude Nulls (any WMI failures)
            if ($totalBits -gt 0) {
                $result = (( $bitsPerSec / $totalBits) * 100)
                Write-Verbose "Bandwidth utilized:`t $result %"
                $totalBandwidth = $totalBandwidth + $result
                $count++
            }
        }
        Start-Sleep -milliseconds 100

        # recalculate the remaining time
        $timeSpan = new-timespan $(Get-Date) $endTime
    }

    Write-Verbose "Measurements:`t`t $count"

    $averageBandwidth = $totalBandwidth / $count
    $value = "{0:N2}" -f $averageBandwidth
    Write-Verbose "Average Bandwidth utilized:`t $value %"
    return $value;
}

Nun müssen wir noch eine weitere Funktion schreiben, welche die erste Funktion zum Messen benutzt und ab einer niedriger Netzwerkauslastung den PC herunterfährt.

function Stop-ComputerByNetworkUsage {
	[CmdletBinding()]
	param (
		[Parameter(Mandatory = $false)]
		[decimal]
		$UsageInPercent = 0.05
	)
	do {
		$result = Get-Bandwidth
	}until($result -lt $UsageInPercent);
	Stop-Computer -Force
}

Nun kann man einfach Stop-ComputerByNetworkUsage aufrufen. Damit wird der PC herruntergefahren sobald du Netzwerknutzung unter 0.05% fällt.