如何使 .bat 文件仅在系统托盘中运行?

如何使 .bat 文件仅在系统托盘中运行?

TL;DR 在底部!

详情请见此处:

由于两个原因,我的 Win 10 笔记本电脑的互联网连接不可靠,它通过无线连接到我的路由器,而路由器通过有线连接到我的调制解调器。

  • 原因 1,不是 Win 10 的错:我的调制解调器经常出故障(我不知道是调制解调器本身的问题,还是 ISP 的问题,还是其他什么原因,但确实如此),然后它就会重新启动。当这种情况发生时,我的笔记本电脑上的互联网(显然)也会断开,但调制解调器重新启动后它不会重新连接。唯一能做到这一点的方法是,我从“网络连接”窗口禁用无线适配器,然后启用它。

  • 原因 2,Win 10 的问题:我的笔记本电脑有时会被踢出 Wi-Fi 网络。这本身可能是由 Win 10 以外的其他原因引起的,例如我的 NIC 或路由器。让我恼火的是,Win 10 不会自动重新连接到网络,尽管它应该这样做。当我自己点击 Wi-Fi 菜单中的“连接”按钮时,它工作正常。


我决定制作一个 *.bat 文件,用于检测这两种情况的发生情况,然后解决问题。在网上搜索了一番后,我设法编写了以下脚本:

@echo off
:LOOP
ping 8.8.8.8
IF ERRORLEVEL 1 goto RESTART
IF ERRORLEVEL 0 goto LOOP
:RESTART
netsh interface set interface "<wireless adapter>" disabled
netsh interface set interface "<wireless adapter>" enabled
netsh wlan connect name="<ssid>" interface="<wireless adapter>"
timeout /t 15
goto LOOP

这很好用(以管理员身份运行时),但现在的问题是我想要 cmd 窗口不是在进程运行时保持打开状态(在屏幕上和任务栏中);我希望它在托盘中运行,这样我仍可以轻松退出它(如果需要),而不必转到任务管理器。我知道我可以在任务计划程序中安排脚本在启动时最小化启动,但这不会只是将窗口从任务栏中隐藏吗?

总结:

如何让 *.bat 文件在托盘中/按时钟运行,以便我可以轻松右键单击它并停止/退出?编译可执行文件是实现此目的的唯一方法吗?

答案1

因为我不相信这可以通过一个简单的.bat文件来完成,所以这似乎是一项工作自动热键

AutoHotkey (AHK) 是一款适用于 Windows 的免费开源宏创建和自动化软件,可让用户自动执行重复性任务。它由一种脚本语言驱动,该语言最初旨在提供键盘快捷键(也称为热键),随着时间的推移,它逐渐演变成一种成熟的脚本语言。

根据 2014 年的这个论坛帖子您应该能够使用类似这样的脚本切换窗口可见性:

#NoTrayIcon
#Persistent

global hBatFile

/* Setup Tray icon and add item that will handle
* double click events
*/
Menu Tray, Icon
Menu Tray, Icon, C:\windows\system32\cmd.exe
Menu Tray, Add, Show / Hide Pingu, TrayClick
Menu Tray, Add, Close Pingu, CloseItem
Menu Tray, Default, Show / Hide Pingu

;// Run program or batch file hidden
DetectHiddenWindows On
Run pingu.bat,, Hide, PID
WinWait ahk_pid %PID%
hBatFile := WinExist()
DetectHiddenWindows Off
return

TrayClick:
OnTrayClick()
return

;// Show / hide program or batch file on double click
OnTrayClick() {
    if DllCall("IsWindowVisible", "Ptr", hBatFile) {
        WinHide ahk_id %hBatFile%

    } else {
        WinShow ahk_id %hBatFile%
        WinActivate ahk_id %hBatFile%
    }
}

CloseItem() {

       DetectHiddenWindows On
       WinWait ahk_class ConsoleWindowClass
       Process, Close, cmd.exe
       DetectHiddenWindows Off
       ExitApp

}

该脚本已使用 AutoHotKey 1.1.24.00(2016 年 5 月)进行测试。

编辑:这是 OP 修改后的改进版本的链接。

在这种情况下:

  • 企鹅是我们希望运行的批处理文件的(任意)名称
  • 脚本文件是保存一些窗口信息的任意变量名
  • 企鹅是显示在附加 AHK 托盘菜单项中的任意名称

只需将脚本保存为类似的内容tray.ahk(注意.ahk脚本扩展名)并双击运行它(假设您已经安装了 AutoHotKey)。

该脚本以最小化方式启动批处理文件,并用托盘中的微型控制台窗口图标替换默认的 AHK 脚本图标。

可以通过双击托盘图标或添加的托盘菜单项(以粗体显示在选择菜单的底部)来切换控制台窗口可见性。

可以使用Close下面添加的菜单项来关闭批处理文件和命令窗口Show / HideExit只会关闭脚本,而不会关闭控制台窗口)。

另请注意

Run pingu.bat,, Hide, PID

显然需要用pingu.bat您自己的批处理文件的名称替换。此行假定 AHK 脚本出现在与pingu.batpingu.bat全局可访问的同一目录中(即,它已添加到系统路径或用户 PATH 变量中的文件夹中)。否则,您需要用pingu.bat可执行文件的完整路径替换(注意空格!)。


注意事项

此脚本主要充当窗口可见性的接口。这意味着,如果您Exit通过托盘图标,则只会退出 AHK 脚本,而不会退出批处理文件。

简单的解决方案是使用添加的Close菜单项退出脚本并停止cmd.exe。或者,您可以:

  • 显示控制台窗口并使用Ctrl+ C(或者直接用红色“X”关闭控制台窗口)来终止批处理过程。

  • Exit从托盘图标中选择以停止 AHK 脚本

如上所述,它们是独立的过程。


注意:如果首先终止 AHK 脚本,则具有隐藏窗口的孤立控制台程序无法再次直接访问Exit- 但您可以使用任务管理器关闭相关cmd.exe进程。


Close如果只有一个进程,则菜单项可以正常工作。cmd.exe但是,如果正在运行多个cmd.exe进程,这可能无法正确关闭您使用脚本启动的批处理文件(它可能会关闭其他文件)。您可能希望改为通过进程 ID (PID) 关闭。也就是说,您也可以使用上面相同的显示/关闭/退出过程。


脚本说明

Menu Tray, Icon, C:\windows\system32\cmd.exe

指的是已编译的可执行文件及其关联的嵌入图标文件的位置。您应该能够将其替换为对任何带有嵌入图标的可执行文件的引用,或者直接引用图标文件,.ico例如

Menu Tray, Icon, C:\Path\To\Icons\icon.ico

答案2

如何让 *.bat 文件在托盘中运行?

您可以使用再生托盘

RBTray 是一个在后台运行的小型 Windows 程序,通过右键单击其最小化按钮,几乎可以将任何窗口最小化到系统托盘。

它是免费的、开源的,并根据 GNU 通用公共许可证的条款进行分发。

它只有 45k 并且有 32 位和 64 位版本。


免责声明

我不隶属于再生托盘无论如何,我只是他们软件的最终用户。

答案3

您可以使用开源工具移动鼠标它允许在 SysTray 中以最小化方式运行,并且可以轻松地按照计划或基于事件的方式运行批处理脚本。

其最初的目的是稍微移动鼠标指针以防止基于不活动的应用程序/或系统操作(例如在聊天程序中进入离开状态或在演示期间运行屏幕保护程序)。


设置:

要进行设置,请打开应用程序,然后单击“脚本”选项卡,您可以选择“在每个间隔执行脚本”:通过以下方式导入要运行的(Power Shell)脚本进口按钮,然后点击开始按钮。间隔时间可在“操作”标签,以秒为单位。

通过“时间表”标签您还可以根据时间表设置何时开始/停止运行脚本。如果需要,您还可以设置停电期通过输入开始和停止时间“停电”标签,在此期间阻止脚本的执行。


笔记:由于 MoveMouse 仅支持 PowerShell 脚本,因此如果您需要运行批处理文件,则可以按start-process C:Pathfile.bat如下方式调用它start-process "cmd.exe" "/c C:Pathfile.bat"这里。

相关内容