Windows 11 实现移动热点自启动

最近更新于 2024-07-29 08:03

背景

公司的 WiFi 用起来很卡,但是电脑有线使用网络又是正常的,另外我用的那台台式机是有无线网卡的,平时就是用电脑开热点给手机用,但是每次开机都要自己手动启动就麻烦,有时候还忘了。所以到处查找方法尝试,终于找到一个可行的方案。

测试环境:
Windows 11 专业工作站版 23H2
PowerShell 5.1(使用预装的版本)

操作

设置好热点信息

Win+I打开设置,前往网络和Internet-》移动热点
file

主要就是设置网络名称和密码,频段根据需要自己选择
file

然后打开移动热点,可以看到多出来一个节能,把它关掉就不会自动停用 WiFi 了
file

允许 PowerShell 脚本执行

Windows 默认禁止 PowerShell 运行脚本文件,
以管理员身份打开
file

执行

Set-Executionpolicy RemoteSigned

file

创建 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
file

file

这个脚本提供了三种模式(注意这个脚本在 Windows 11 预装的 PowerShell 5.x 可以运行,但在自己安装的新的 7.x 无法使用)

# 用于实现自启动
powershell 【hotspot.ps1路径】

# 手动启动热点
powershell 【hotspot.ps1路径】1

# 手动关闭热点
powershell 【hotspot.ps1路径】1

创建自动执行任务

打开任务计划程序
file

创建任务
file

自己为任务命名
file

新建触发器,比如可以选择解锁时(输入密码认证进入桌面时)
file

新建操作
程序或脚本处填C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
添加参数处填上面脚本文件的所在路径,比如我这里是%HOMEPATH%\hotspot.ps1
file

条件栏可能会默认勾选使用交流电才启动任务(插上电源时),去掉的话不插电源默认也启用(主要针对笔记本电脑,勾选了没插电源不会执行)
file

设置完,确定即可,可以按Win+L锁定,再尝试登录验证脚本是否按预期的执行
file

Windows 11 实现移动热点自启动
Scroll to top