原文链接:https://blog.iyatt.com/?p=16784
背景
公司的 WiFi 用起来很卡,但是电脑有线使用网络又是正常的,另外我用的那台台式机是有无线网卡的,平时就是用电脑开热点给手机用,但是每次开机都要自己手动启动就麻烦,有时候还忘了。所以到处查找方法尝试,终于找到一个可行的方案。
测试环境:
Windows 11 专业工作站版 23H2
PowerShell 5.1(使用预装的版本)
操作
设置好热点信息
按{Win}
+{I}
打开设置,前往网络和Internet-》移动热点
主要就是设置网络名称和密码,频段根据需要自己选择
然后打开移动热点,可以看到多出来一个节能,把它关掉就不会自动停用 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 hotspot
Function Check_HotspotStatus() {
$tetheringManager = Get_TetheringManager
return $tetheringManager.TetheringOperationalState -eq "Off"
}
# Define a function to start the hotspot
Function 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}
锁定,再尝试登录验证脚本是否按预期的执行