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

Nic*_*rds 5 networking wireless-networking command-line-arguments batch-file windows-10

TL;底部的DR!

详情在这里:

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

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

  • 原因2,这东西运10的过错:我的笔记本电脑有时候会拉开序幕的Wi-Fi网络。这本身可能是由 Win 10 以外的其他原因引起的,例如我的网卡或路由器。令我烦恼的是,即使 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
Run Code Online (Sandbox Code Playgroud)

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

特尔;博士:

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

Ana*_*man 3

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

\n\n
\n

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

\n
\n\n

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

\n\n
#NoTrayIcon\n#Persistent\n\nglobal hBatFile\n\n/* Setup Tray icon and add item that will handle\n* double click events\n*/\nMenu Tray, Icon\nMenu Tray, Icon, C:\\windows\\system32\\cmd.exe\nMenu Tray, Add, Show / Hide Pingu, TrayClick\nMenu Tray, Add, Close Pingu, CloseItem\nMenu Tray, Default, Show / Hide Pingu\n\n;// Run program or batch file hidden\nDetectHiddenWindows On\nRun pingu.bat,, Hide, PID\nWinWait ahk_pid %PID%\nhBatFile := WinExist()\nDetectHiddenWindows Off\nreturn\n\nTrayClick:\nOnTrayClick()\nreturn\n\n;// Show / hide program or batch file on double click\nOnTrayClick() {\n    if DllCall("IsWindowVisible", "Ptr", hBatFile) {\n        WinHide ahk_id %hBatFile%\n\n    } else {\n        WinShow ahk_id %hBatFile%\n        WinActivate ahk_id %hBatFile%\n    }\n}\n\nCloseItem() {\n\n       DetectHiddenWindows On\n       WinWait ahk_class ConsoleWindowClass\n       Process, Close, cmd.exe\n       DetectHiddenWindows Off\n       ExitApp\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

在这种情况下:

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

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

\n\n

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

\n\n

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

\n\n

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

\n\n

另请注意

\n\n
Run pingu.bat,, Hide, PID\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

注意事项

\n\n

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

\n\n

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

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

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

  • \n
\n\n

如前所述,它们是单独的过程。

\n\n
\n\n

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

\n\n
\n\n

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

\n\n
\n\n

脚本注释

\n\n
Menu Tray, Icon, C:\\windows\\system32\\cmd.exe\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
Menu Tray, Icon, C:\\Path\\To\\Icons\\icon.ico\n
Run Code Online (Sandbox Code Playgroud)\n