Como posso fazer com que um arquivo .bat seja executado apenas na bandeja do sistema?

3

TL; DR na parte inferior!

Detalhes aqui:

Eu tenho uma conexão de internet não confiável devido a 2 motivos em meu laptop Win 10, que está conectado sem fio ao meu roteador, que está conectado por fio ao meu modem.

  • Razão 1, algo que não é culpa do Win 10: Meu modem muitas vezes fritzes (IDK se é o modem em si, o ISP, ou o que, mas sim), pelo que meio que apenas reinicia. Quando isso acontece, a internet no meu laptop (obviamente) também se apaga, mas não se reconecta quando o modem é ligado novamente. A única maneira de fazer isso é se eu desabilitar e habilitar meu adaptador sem fio na janela Conexões de Rede.

  • Razão 2, algo que é culpa do Win 10: Meu laptop às vezes é expulso da rede Wi-Fi. Isso pode ser causado por algo diferente do Win 10, como meu NIC ou meu roteador. O que me incomoda é quando o Win 10, em seguida, não reconecta automaticamente à rede, mesmo que seja suposto. Quando clico no botão "Conectar" no menu Wi-Fi, ele funciona bem.

Eu decidi fazer um arquivo * .bat que detectaria sempre que algum dos cenários ocorresse, e então corrigir o problema. Com um pouco de pesquisa na internet, consegui reunir o seguinte script:

@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

Isso funciona muito bem (quando é Executar como Administrador), mas agora o problema é que eu quero que a janela cmd não permaneça aberta (na tela e na barra de tarefas) enquanto o processo é executado; Eu quero que ele seja executado na bandeja em vez disso, então eu ainda posso sair facilmente se eu precisar, sem ter que ir para o Gerenciador de Tarefas. Eu sei que posso agendar o script no Agendador de Tarefas para começar minimizado na inicialização, mas isso não vai esconder a janela da barra de tarefas?

TL; DR:

Como faço para executar um arquivo * .bat na bandeja / pelo relógio, onde posso clicar com o botão direito do mouse e parar / sair? A compilação de um executável é a única maneira de conseguir isso?

    
por Nicholas Richards 29.07.2016 / 05:57

3 respostas

2

Como não acredito que isso possa ser feito simplesmente por meio de um arquivo .bat, isso parece um trabalho para AutoHotKey .

AutoHotkey (AHK) is a free, open-source macro-creation and automation software for Windows that allows users to automate repetitive tasks. It is driven by a scripting language that was initially aimed at providing keyboard shortcuts, otherwise known as hotkeys, that over time evolved into a full-fledged scripting language.

De acordo com este post do fórum de 2014 , você deve ser capaz de alternar a visibilidade da janela com um script semelhante para isso:

#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

}

Este script foi testado com o AutoHotKey 1.1.24.00 (maio de 2016).

EDIT: Aqui está um link para a versão modificada do OP com melhorias

Neste caso:

  • pingu.bat é o nome (arbitrário) do arquivo em lote que desejamos executar
  • hBatFile é um nome de variável arbitrária que contém algumas informações da janela
  • Pingu é um nome arbitrário que aparece nos itens adicionais do menu da bandeja AHK

Basta salvar o script como algo como "tray.ahk" (observe a extensão de script .ahk) e clique duas vezes para executar (supondo que você tenha instalado o AutoHotKey).

O script inicia o arquivo de lote minimizado e substitui o ícone padrão do script AHK por um ícone de janela do console em miniatura na bandeja.

A visibilidade da janela do console pode ser alternada com um clique duplo no ícone da bandeja ou no item de menu da bandeja adicionada (exibida em negrito na parte inferior do menu de seleção).

Fechar o arquivo de lote e a janela de comando pode ser feito com o item de menu "Fechar" adicionado abaixo de "Mostrar / ocultar" ("Sair" fechará apenas o script, não a janela do console).

Observe também que

Run pingu.bat,, Hide, PID

obviamente precisará que o "pingu.bat" seja substituído pelo nome do seu próprio arquivo de lote. Esta linha assume que o script AHK aparece no mesmo diretório que "pingu.bat" ou que "pingu.bat" é globalmente acessível (isto é, foi adicionado a uma pasta em seu caminho do sistema ou variáveis PATH do usuário). Caso contrário, você desejará substituir "pingu.bat" pelo caminho completo para o executável (observe os espaços!).

Advertências

Esse script funciona principalmente como uma interface para a visibilidade da janela. O que isto significa é que se você "Sair" através do ícone da bandeja, você está saindo apenas do script AHK, não do seu arquivo de lote.

A solução simples é usar o item de menu "Fechar" para sair do script e parar cmd.exe. Caso contrário, você pode mostrar a janela do console e Ctrl-C (ou simplesmente fechar a janela do console com o 'X' vermelho) para finalizar o processo em lote e selecionar "Sair" no ícone da bandeja para parar o script AHK. processos separados, como mencionado.

Observação : Programas de console órfãos com janelas ocultas não podem ser acessados diretamente novamente se o script AHK for encerrado com "Sair" primeiro - mas você pode usar o Gerenciador de Tarefas para feche o processo cmd.exe associado com bastante facilidade.

Por fim, o item de menu "Fechar", conforme escrito, funciona bem se houver apenas um processo cmd.exe. No entanto, se mais de um estiver em execução, isso pode não fechar corretamente o arquivo de lote iniciado com o script (ele pode fechar outra coisa). Você pode querer examinar o fechamento por ID do processo. Caso contrário, você pode "Mostrar", sair do script em lote e, em seguida, "Sair" do script AHK como acima.

Notas do script

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

refere-se ao local de um executável compilado com um arquivo de ícone incorporado associado. Você deve poder substituir isso por uma referência a qualquer executável com um ícone incorporado ou com uma referência direta a um arquivo de ícone .ico, por exemplo,

Menu Tray, Icon, C:\Path\To\Icons\icon.ico
    
por 29.07.2016 / 11:09
2

Como faço um arquivo * .bat na bandeja?

Você pode usar RBTray :

RBTray is a small Windows program that runs in the background and allows almost any window to be minimized to the system tray by right clicking its minimize button.

It is free, open source, and is distributed under the terms of the GNU General Public Licence.

É apenas 45k e tem versões de 32 e 64 bits.

Aviso de isenção

Eu não sou afiliado com RBTray de qualquer forma, eu sou apenas um usuário final de seu software.

    
por 29.07.2016 / 14:21
0

Você pode usar a ferramenta de código aberto MoveMouse , que permite executar mininizado no SysTray e permite executar facilmente scripts em lote em um evento ou programado caminho baseado.

Sua finalidade original é mover o mouse um pouco para evitar ações do aplicativo / sistema (como inserir status ausente em programas de bate-papo ou executar proteções de tela durante apresentações) com base na inatividade.

    
por 29.07.2016 / 21:32