因為有在使用類似 Wox,所以想著寫個腳本自動連向指定的 Wi-Fi 應該會很方便吧?沒想到轉成指令的過程花了不少時間就來筆記一下。
先總結一下,打開 Wi-Fi 從底層算起會涉汲三個東西
- 啟用/關閉 Wi-Fi 網卡
- 打開/關閉 Wi-Fi 無線功能
- 連接/斷開 指定連線
每一層的前一底層未開啟,都會讓當前的功能失效。
網路很多舊文章在講如何停用 Wi-Fi 主要都透過關閉網卡(第一層),應該是比較早期的運作方式。現在一般操作已經不去開關網卡了,不用關閉也可以開關 Wi-Fi 無線功能(第二層),我主要是卡關在第二層的控制指令找不到。
因為在日常連線 Wi-Fi 是不會去更動網卡的,在假設 Wi-Fi 網卡已設定好的狀況下,只需要執行 1.打開 Wi-Fi 無線功能 2.連接指定連線 就可以完成我的需求了
powershell Set-NetAdapterAdvancedProperty -Name "Wi-Fi" -AllProperties -RegistryKeyword "SoftwareRadioOff" -RegistryValue "0"
netsh wlan connect name="my profile name(ssid)"
指令是寫在 .bat 檔的 cmd 語法,第一行是打開 Wi-Fi 無線功能,是透過 PowerShell 模組功能實現的,需要有 Administrator 權限。第二行指定 profile 進行連線(通常 profile name = SSID) 的 Wi-Fi,可以用一般權限來執行,用雙引號括住無可以輸入有空格的 profile name 了。
這裡沒有輸入 Wi-Fi 密碼,因為情境設定在這之前已經連過該 Wi-Fi 並記住密碼了。
順利沒踩坑的話,看到這裡就夠用了。
遇到的坑
關於 netsh wlan connect
指令在某些版本的 Windows 遇到含空白的 profile name 會跳錯 Function WlanGetProfile returns error 1168:Element not found.
,很不巧被我遇到了,有兩個可以暫時繞過的方法
- 去改 Wi-Fi 的 SSID
- 建一個沒有空白的 profile
我選擇匯出 profile xml 檔,修改成沒有空白的 name 再匯入成另一個 profile。指令匯入 profile
netsh wlan export profile name="Coffee Wifi 5Ghz" folder="D:\MyWifi"
"Coffee Wifi 5Ghz" 可以換成任何 Windows Wi-Fi UI 打開來看到的可用連線名稱,會匯出成 Wi-Fi-Coffee Wifi 5Ghz.xml 在 MyWifi 資料夾內,如果已連線過並記憶密碼,這個 profile 也包含密碼(已加密)。
修改 xml,WLANProfile > name 改成沒有空白的 name,例如 Coffee_Wifi_5Ghz,再匯入 profile xml 檔
netsh wlan add profile filename="D:\MyWifi\Wi-Fi-Coffee Wifi 5Ghz.xml"
這時再看 Wi-Fi 可用連線名稱就會看到 Coffee_Wifi_5Ghz,它的連線內容和 Coffee Wifi 5Ghz 是一樣的,改用新的 profile name 來繞過 Windows Bug。
開關 Wi-Fi
開關 Wi-Fi 無線功能的指令很難搜尋,因為一開始不知道合適的關鍵字,搜尋結果大多是開關更底層的 Wi-Fi 網卡。而一旦關閉(disable) Wi-Fi 網卡,整個 Wi-Fi 無線功能就會從功能列快捷選單消失,再開啟網卡 Wi-Fi 無線功能也不會自動開啟,Wi-Fi 無線功能沒開啟,連線指令也無法運作。
後來在 Stack Overflow(連結) 找到一篇相關的討論,討論裡使用的則是 RadioEnable 看起來蠻像的,可惜實際跑起來沒作用,但也給了我找解的方向。用 PowerShell Get-NetAdapterAdvancedProperty 模組比對 Wi-Fi 無線功能開關前後的參數變化,找到了幾個可能可以用的參數
powershell Get-NetAdapterAdvancedProperty -Name "Wi-Fi" -AllProperties
其中 SoftwareRadioOff 實測確實可以順利開關 Wi-Fi 無線功能。而 RadioEnable 在其它地方(連結)看到有可能曾經在 .NET Core 的時代有作用,到 .NET 5 時移除 WinRT 支援就失效了(這段超出我的程度了,不清楚在說什麼)
以後關鍵字應該會下 Wi-Fi Radio turn on
參考資料
https://www.windowscentral.com/how-connect-wi-fi-network-windows-10