Runtime variable (Wake On LAN)

Written By Mikel from Gorelo

You can leave a script variable blank and have it prompt the user when run on-demand via the CLI.โ€‹ In this example, we'll send a WOL packet to a MAC address entered at runtime.

Step 1: Create the script

  1. Navigate to Scripts

  2. Create a script with the following details:

    • Name: Wake on LAN

    • Content:

Example
$MacToWake = $gorelo:MacToWake function Send-WoL { [CmdletBinding()] param( [Parameter(Mandatory)] [string]$MacAddress, # Optional: force a specific interface by alias (e.g., "Wi-Fi") [string]$InterfaceAlias ) # --- Normalize & validate MAC --- $norm = $MacAddress -replace '[:\-\. ]','' if ($norm -notmatch '^[0-9A-Fa-f]{12}$') { throw "Invalid MAC after normalization: '$norm'." } $macBytes = New-Object byte[] 6 for ($i = 0; $i -lt 12; $i += 2) { $macBytes[$i/2] = [Convert]::ToByte($norm.Substring($i,2),16) } # --- Build magic packet --- $packet = New-Object byte[] (6 + 16*6) for ($i=0; $i -lt 6; $i++) { $packet[$i] = 0xFF } for ($block=0; $block -lt 16; $block++) { [Array]::Copy($macBytes, 0, $packet, 6 + ($block*6), 6) } # --- Pick active IPv4 from interface with best default route (0.0.0.0/0) --- $route = Get-NetRoute -DestinationPrefix '0.0.0.0/0' -ErrorAction SilentlyContinue | Sort-Object -Property RouteMetric, InterfaceMetric | Select-Object -First 1 $ipRec = $null if ($InterfaceAlias) { $ipRec = Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias $InterfaceAlias -ErrorAction SilentlyContinue | Where-Object { $_.IPAddress -notlike '169.254*' -and $_.IPAddress -ne '127.0.0.1' } | Sort-Object -Property PrefixLength -Descending | Select-Object -First 1 } if (-not $ipRec -and $route) { $ipRec = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $route.InterfaceIndex -ErrorAction SilentlyContinue | Where-Object { $_.IPAddress -notlike '169.254*' -and $_.IPAddress -ne '127.0.0.1' } | Select-Object -First 1 } if (-not $ipRec) { $ipRec = Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | Where-Object { $_.IPAddress -notlike '169.254*' -and $_.IPAddress -ne '127.0.0.1' } | Select-Object -First 1 } if (-not $ipRec) { throw "Couldn't detect a valid IPv4 address." } $ipBytes = ([System.Net.IPAddress]::Parse($ipRec.IPAddress)).GetAddressBytes() $prefix = [int]$ipRec.PrefixLength # --- Build subnet mask bytes from prefix length (no Int32 conversion) --- $maskBytes = 0,0,0,0 $bits = $prefix for ($i=0; $i -lt 4; $i++) { if ($bits -ge 8) { $maskBytes[$i] = 255; $bits -= 8 } elseif ($bits -gt 0) { $maskBytes[$i] = (0xFF - ( [math]::Pow(2, (8 - $bits)) - 1 )) -band 0xFF $bits = 0 } else { $maskBytes[$i] = 0 } } # --- Compute broadcast: ip OR (NOT mask) (byte-wise) --- $broadcastBytes = New-Object byte[] 4 for ($i=0; $i -lt 4; $i++) { $invMask = (0xFF - $maskBytes[$i]) -band 0xFF $broadcastBytes[$i] = ($ipBytes[$i] -bor $invMask) -band 0xFF } $broadcast = [System.Net.IPAddress]::new($broadcastBytes) # --- Send to common WoL ports --- foreach ($port in 9,7) { $udp = New-Object System.Net.Sockets.UdpClient $udp.EnableBroadcast = $true $endpoint = New-Object System.Net.IPEndPoint $broadcast, $port [void]$udp.Send($packet, $packet.Length, $endpoint) $udp.Close() Write-Host "Magic packet sent to $MacAddress via $($broadcast.ToString()):$port" } } # Example: # Send-WoL -MacAddress "98:FA:9B:55:B4:50" # Or force a specific adapter: # Send-WoL -MacAddress "98:FA:9B:55:B4:50" -InterfaceAlias "Wi-Fi" # Example usage Send-WoL -MacAddress $MacToWake
  1. Add the โ€˜MacToWakeโ€˜ script variable and leave the value field blank

  2. Save the script

  3. Pin the script via the 3-dot menu so itโ€™s available via the CLI