原文链接:https://blog.iyatt.com/?p=16784
背景
公司的 WiFi 用起来很卡,但是电脑有线使用网络又是正常的,另外我用的那台台式机是有无线网卡的,平时就是用电脑开热点给手机用,但是每次开机都要自己手动启动就麻烦,有时候还忘了。所以到处查找方法尝试,终于找到一个可行的方案。
测试环境:
Windows 11 专业工作站版 23H2
PowerShell 5.1(使用预装的版本)
操作
设置好热点信息
按
{Win}
打开设置,前往网络和Internet-》移动热点{I}
主要就是设置网络名称和密码,频段根据需要自己选择
然后打开移动热点,可以看到多出来一个节能,把它关掉就不会自动停用 WiFi 了
允许 PowerShell 脚本执行
Windows 默认禁止 PowerShell 运行脚本文件,
以管理员身份打开
执行
Set-Executionpolicy RemoteSigned
创建 PowerShell 脚本文件用于实现 WiFi 打开
脚本基于 https://gist.github.com/primaryobjects/8b54f7f4219960127f1f620116315a37
修改。
创建一个文本文件,将下面的内容粘粘进去,保存后扩展名改为 .ps1
$PSVersionTable"-"* 100
Add-Type-AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods()|Where-Object{$_.Name -eq'AsTask'-and$_.GetParameters().Count -eq 1 -and$_.GetParameters()[0].ParameterType.Name -eq'IAsyncOperation`1'})[0]Function Await($WinRtTask,$ResultType){$asTask = $asTaskGeneric.MakeGenericMethod($ResultType)$netTask = $asTask.Invoke($null, @($WinRtTask))$netTask.Wait(-1)|Out-Null$netTask.Result
}Function AwaitAction($WinRtAction){$asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods()|Where-Object{$_.Name -eq'AsTask'-and$_.GetParameters().Count -eq 1 -and!$_.IsGenericMethod })[0]$netTask = $asTask.Invoke($null, @($WinRtAction))$netTask.Wait(-1)|Out-Null}Function Get_TetheringManager(){$connectionProfile = [Windows.Networking.Connectivity.NetworkInformation,Windows.Networking.Connectivity,ContentType=WindowsRuntime]::GetInternetConnectionProfile()$tetheringManager = [Windows.Networking.NetworkOperators.NetworkOperatorTetheringManager,Windows.Networking.NetworkOperators,ContentType=WindowsRuntime]::CreateFromConnectionProfile($connectionProfile)return$tetheringManager;}Function SetHotspot($Enable){$tetheringManager = Get_TetheringManager
if($Enable-eq 1){if($tetheringManager.TetheringOperationalState -eq 1){"Hotspot is already On!"}else{"Hotspot is off! Turning it on"
Await ($tetheringManager.StartTetheringAsync())([Windows.Networking.NetworkOperators.NetworkOperatorTetheringOperationResult])}}else{if($tetheringManager.TetheringOperationalState -eq 1){"Hotspot is on! Turning it off"
Await ($tetheringManager.StopTetheringAsync())([Windows.Networking.NetworkOperators.NetworkOperatorTetheringOperationResult])}else{"Hotspot is already Off!"}}}# Define a function to check the status of the hotspotFunction Check_HotspotStatus(){$tetheringManager = Get_TetheringManager
return$tetheringManager.TetheringOperationalState -eq"Off"}# Define a function to start the hotspotFunction Start_Hotspot(){$tetheringManager = Get_TetheringManager
Await ($tetheringManager.StartTetheringAsync())([Windows.Networking.NetworkOperators.NetworkOperatorTetheringOperationResult])}Function exitCountdown($sec){for(;$sec-ge 0;--$sec){"$sec"Start-Sleep-Seconds 1
}exit 0
}if($args.Length -eq 0){while(Check_HotspotStatus){
SetHotspot 1
Start-Sleep-Seconds 2
if(Check_HotspotStatus){"Failure.Try again in 2s."Start-Sleep-Seconds 2
continue}else{"Success.Exit in 10s."
exitCountdown 10
exit 0
}}"Hotspot is already.Exit in 10s."
exitCountdown 10
}else{switch($args[0]){"0"{
SetHotspot 0
break}"1"{
SetHotspot 1
break}
default {"Invalid parameter, please enter 1 to turn on hotspot, enter 0 to turn off hotspot"exit 1
}}}
建议放置到固定路径,比如我放置在**%HOMEPATH%**家目录下,命名为 hotspot.ps1
这个脚本提供了三种模式(注意这个脚本在 Windows 11 预装的 PowerShell 5.x 可以运行,但在自己安装的新的 7.x 无法使用)
# 用于实现自启动
powershell 【hotspot.ps1路径】
# 手动启动热点
powershell 【hotspot.ps1路径】1
# 手动关闭热点
powershell 【hotspot.ps1路径】1
创建自动执行任务
打开任务计划程序
创建任务
自己为任务命名
新建触发器,比如可以选择解锁时(输入密码认证进入桌面时)
新建操作
程序或脚本处填C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
添加参数处填上面脚本文件的所在路径,比如我这里是**%HOMEPATH%\hotspot.ps1**
在条件栏可能会默认勾选使用交流电才启动任务(插上电源时),去掉的话不插电源默认也启用(主要针对笔记本电脑,勾选了没插电源不会执行)
设置完,确定即可,可以按
{Win}
锁定,再尝试登录验证脚本是否按预期的执行{L}
版权归原作者 astuv 所有, 如有侵权,请联系我们删除。