![如何使 .bat 文件仅在系统托盘中运行?](https://linux22.com/image/1501599/%E5%A6%82%E4%BD%95%E4%BD%BF%20.bat%20%E6%96%87%E4%BB%B6%E4%BB%85%E5%9C%A8%E7%B3%BB%E7%BB%9F%E6%89%98%E7%9B%98%E4%B8%AD%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
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 月)进行测试。
在这种情况下:
- 企鹅是我们希望运行的批处理文件的(任意)名称
- 脚本文件是保存一些窗口信息的任意变量名
- 企鹅是显示在附加 AHK 托盘菜单项中的任意名称
只需将脚本保存为类似的内容tray.ahk
(注意.ahk
脚本扩展名)并双击运行它(假设您已经安装了 AutoHotKey)。
该脚本以最小化方式启动批处理文件,并用托盘中的微型控制台窗口图标替换默认的 AHK 脚本图标。
可以通过双击托盘图标或添加的托盘菜单项(以粗体显示在选择菜单的底部)来切换控制台窗口可见性。
可以使用Close
下面添加的菜单项来关闭批处理文件和命令窗口Show / Hide
(Exit
只会关闭脚本,而不会关闭控制台窗口)。
另请注意
Run pingu.bat,, Hide, PID
显然需要用pingu.bat
您自己的批处理文件的名称替换。此行假定 AHK 脚本出现在与pingu.bat
或pingu.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
答案3
您可以使用开源工具移动鼠标它允许在 SysTray 中以最小化方式运行,并且可以轻松地按照计划或基于事件的方式运行批处理脚本。
其最初的目的是稍微移动鼠标指针以防止基于不活动的应用程序/或系统操作(例如在聊天程序中进入离开状态或在演示期间运行屏幕保护程序)。
设置:
要进行设置,请打开应用程序,然后单击“脚本”选项卡,您可以选择“在每个间隔执行脚本”:通过以下方式导入要运行的(Power Shell)脚本进口按钮,然后点击开始按钮。间隔时间可在“操作”标签,以秒为单位。
通过“时间表”标签您还可以根据时间表设置何时开始/停止运行脚本。如果需要,您还可以设置停电期通过输入开始和停止时间“停电”标签,在此期间阻止脚本的执行。
笔记:由于 MoveMouse 仅支持 PowerShell 脚本,因此如果您需要运行批处理文件,则可以按start-process C:Pathfile.bat
如下方式调用它start-process "cmd.exe" "/c C:Pathfile.bat"
:这里。