3

TL; DR внизу!

Подробности здесь:

У меня ненадежное подключение к Интернету по двум причинам на моем ноутбуке с Win 10, который беспроводным образом подключен к маршрутизатору, который подключен через модем.

  • Причина 1, что не является ошибкой Win 10: мой модем часто бесит (IDK, если это сам модем, провайдер или что-то еще, но да), в результате чего он просто перезагружается. Когда это происходит, интернет на моем ноутбуке (очевидно) тоже отключается, но затем не подключается при включении модема. Единственный способ сделать это - отключить, а затем включить беспроводной адаптер из окна "Сетевые подключения".

  • Причина 2 - ошибка Win 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

Это прекрасно работает (когда он запускается от имени администратора), но теперь проблема в том, что я хочу, чтобы окно cmd не оставалось открытым (на экране и на панели задач) во время выполнения процесса; Вместо этого я хочу, чтобы он запускался в трее, поэтому я могу легко выйти из него, если потребуется, без необходимости обращаться к диспетчеру задач. Я знаю, что могу запланировать минимизацию запуска скрипта в планировщике задач при запуске, но разве это не скроет окно от панели задач?

TL; DR:

Как заставить файл * .bat запускаться в трее / по часам, где я могу легко щелкнуть по нему правой кнопкой мыши и остановить / выйти? Является ли компиляция исполняемого файла единственным способом достижения этого?

3 ответа3

2

Как заставить файл * .bat запускаться в трее?

Вы можете использовать RBTray:

RBTray - небольшая программа для Windows, которая работает в фоновом режиме и позволяет свернуть практически любое окно в системный трей, щелкнув правой кнопкой мыши его кнопку сворачивания.

Это бесплатно, с открытым исходным кодом, и распространяется в соответствии с условиями GNU General Public License.

Это только 45 КБ и 32- и 64-битные версии.


отказ

Я никак не связан с RBTray , я просто конечный пользователь их программного обеспечения.

2

Поскольку я не верю, что это можно сделать с помощью простого файла .bat, это похоже на работу AutoHotKey.

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 г.).

РЕДАКТИРОВАТЬ: Вот ссылка на модифицированную версию ОП с улучшениями.

В этом случае:

  • pingu.bat - (произвольное) имя пакетного файла, который мы хотим запустить
  • hBatFile - произвольное имя переменной, содержащее некоторую информацию об окне
  • Pingu - произвольное имя, которое отображается в дополнительных пунктах меню AHK в трее.

Просто сохраните скрипт как что-то вроде «tray.ahk» (обратите внимание на расширение скрипта .ahk) и дважды щелкните для запуска (при условии, что вы установили AutoHotKey).

Сценарий запускает свернутый пакетный файл и заменяет значок сценария AHK по умолчанию значком миниатюрного окна консоли в трее.

Видимость окна консоли можно переключать двойным щелчком по значку на панели задач или добавленному пункту меню в панели задач (выделено жирным шрифтом в нижней части меню выбора).

Закрытие как командного файла, так и командного окна может быть сделано с помощью добавленного пункта меню "Закрыть" под «Показать / Скрыть» ("Выход" закроет только сценарий, а не окно консоли).

Также обратите внимание, что

Run pingu.bat,, Hide, PID

Очевидно, вам нужно будет заменить «pingu.bat» на имя вашего собственного командного файла. В этой строке предполагается, что скрипт AHK находится в том же каталоге, что и «pingu.bat», или что «pingu.bat» доступен глобально (т. Е. Он был добавлен в папку в системном пути или пользовательских переменных PATH). В противном случае вы захотите заменить «pingu.bat» на полный путь к исполняемому файлу (следите за пробелами!).


Предостережения

Этот скрипт в основном служит интерфейсом для видимости окна. Это означает, что если вы "выходите" с помощью иконки в трее, вы выходите только из сценария AHK, а не из своего пакетного файла.

Простое решение - использовать добавленный пункт меню "Закрыть" для выхода из скрипта и остановки cmd.exe. В противном случае, вы можете показать окно консоли и Ctrl-C (или просто закрыть окно консоли с красным 'X'), чтобы завершить пакетный процесс, затем выбрать "Выход" на значке в трее, чтобы остановить скрипт AHK - они отдельные процессы, как уже упоминалось.

Примечание: Потерянные консольные программы со скрытыми окнами не могут быть снова доступны напрямую, если сценарий AHK завершается с "Exit" первым - но вы можете использовать диспетчер задач, чтобы достаточно легко закрыть связанный процесс cmd.exe.

Наконец, пункт меню "Закрыть", как написано, работает нормально, если есть только один процесс cmd.exe. Однако, если запущено более одного, это может некорректно закрыть командный файл, который вы запустили с помощью скрипта (он может закрыть что-то еще). Вы можете захотеть взглянуть на закрытие по идентификатору процесса. В противном случае вы можете "Показать", выйти из пакетного сценария, а затем "Выйти" из сценария AHK, как описано выше.


Примечания сценария

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

относится к расположению скомпилированного исполняемого файла со связанным встроенным файлом значков. Вы должны быть в состоянии заменить это ссылкой на любой исполняемый файл со встроенным значком или прямой ссылкой на файл значка .ico, например

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

Вы можете использовать инструмент с открытым исходным кодом MoveMouse, который позволяет запускать минимизированный в SysTray и легко позволяет запускать пакетные сценарии по расписанию или на основе событий.

Его первоначальное назначение - немного двигать мышь, чтобы предотвратить действия приложения / или системы (такие как ввод статуса в программах чата или запуск экранных заставок во время презентаций) из-за неактивности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .