it-swarm-pt.tech

Execute um arquivo .bat em uma tarefa agendada sem uma janela

Eu tenho uma tarefa agendada que inicia um script em lote que executa robocopy a cada hora. Toda vez que é executada, uma janela aparece na área de trabalho com a saída do robocopy, que eu realmente não quero ver.

Consegui fazer a janela parecer minimizada, executando o trabalho agendado

cmd /c start /min mybat.bat

mas isso me dá uma nova janela de comando a cada hora. Fiquei surpreso com isso, dado cmd /c "Executa o comando especificado por string e finaliza" - devo ter entendido mal os documentos.

Existe uma maneira de executar um script em lote sem ele aparecer uma janela do cmd?

144
Tom Dunham

Você pode executá-lo silenciosamente usando um arquivo de script do Windows. O método Run permite executar um script no modo invisível. Crie um .vbs arquivo como este

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

e agende. O segundo argumento neste exemplo define o estilo da janela. 0 significa "ocultar a janela".

Sintaxe completa do método Run :

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

Argumentos:

  • objeto: objeto WshShell.
  • strCommand: valor da sequência que indica a linha de comando que você deseja executar. Você deve incluir todos os parâmetros que deseja passar para o arquivo executável.
  • intWindowStyle: Opcional. Valor inteiro indicando a aparência da janela do programa. Observe que nem todos os programas usam essas informações.
  • bWaitOnReturn: Opcional. Valor booleano que indica se o script deve aguardar a conclusão da execução do programa antes de continuar com a próxima instrução em seu script. Se definido como true, a execução do script é interrompida até a conclusão do programa e Run retorna qualquer código de erro retornado pelo programa. Se definido como false (o padrão), o método Run retornará imediatamente após o início do programa, retornando automaticamente 0 (não deve ser interpretado como um código de erro).
145
splattne

Você está executando isso como uma tarefa agendada? Se assim for, defina-o para ser executado como uma conta de usuário diferente e não ficará visível para o usuário conectado. Se o script não precisar de acesso à rede para itens que precisam de autenticação do Windows (como compartilhamentos de arquivos ou impressoras), você poderá executá-lo como "nt Authority\system" e deixar a senha em branco. No Windows 7, defina o usuário como SYSTEM e pressione OK.

(Você provavelmente precisará usar um usuário real, se estiver usando robocopy ...)

JR

59
John Rennie

Simplesmente configure a Tarefa agendada como "Executar se o usuário estiver conectado ou não".

29
Peter Meinl

Você também pode tentar CHP (Criar processo oculto) , faz exatamente o que você pensaria ...

CHP.EXE mybat.bat

É executado sem janela de comando. Perfeito! Feito pelas mesmas pessoas que o CMDOW, mas isso é mais apropriado.

18
rocketmonkeys

CMDOW é uma ferramenta incrível que permite que você faça muitas coisas no Windows a partir da linha de comando.

Uma das coisas mais simples a fazer é ocultar a janela atual (geralmente como uma primeira linha no arquivo bat) com:

cmdow @ /hid

ou inicie um novo processo oculto com

cmdow /run /hid mybat.bat 
9
itsadok

Tente chamar o script com

start /b <command>
5
rashfeather

Você pode criar um atalho para o arquivo em lotes, definir o atalho para começar a ser minimizado (nas propriedades do atalho, guia 'Atalho') e, em seguida, definir o trabalho para iniciar o atalho.

Importante: você precisará especificar o caminho para o atalho manualmente, digitando-o no campo de texto Executar, completo com a extensão '.lnk'; se você apenas tentar navegar até ele, será útil redirecionado para o que o atalho apontar.

5
Doug Kavendek

Sei que essa pergunta já foi respondida com uma resolução perfeitamente boa, nativa do Windows e, portanto, deve ser a mais compatível, e concordo completamente.

Eu também queria dizer que não concordo com o comentário de @ splattne (mas não com a resposta real) - que a resolução no outro segmento mencionado merece o crédito. Essa resposta envolve a execução do script como um usuário diferente (SYSTEM), que é praticamente o equivalente a dar acesso à raiz do script. Ele também falhará em trabalhos como ROBOCOPY (conforme referenciado por John Rennie), que exigem acesso à rede.

Eu nunca tentei CMDOW antes, mas gostaria de oferecer outra resolução semelhante, que [apesar de não estar instalada originalmente no Windows] ainda é altamente portátil para a maioria das versões e vem em 32 e 64- versões de bits, e isso é NirCmd .

O NirCmd é uma ferramenta muito poderosa que possui inúmeras opções, das quais a mais útil é pessoalmente a capacidade de iniciar janelas de comando ocultas, executando simplesmente o seguinte:

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

Na seção exec de Referência do comando NirCmd :

exec [show/hide/min/max] [application + command-line]

Executa um aplicativo e, opcionalmente, especifica um ou mais parâmetros de linha de comando para o aplicativo executado. O parâmetro [show/ ocultar /min/max] especifica se o aplicativo em execução será visível ou não. Se 'ocultar' for especificado, o aplicativo em execução não ficará visível para o usuário Se 'max' for especificado, a janela do aplicativo em execução será maximizada. Se 'min' for especificado, a janela do aplicativo em execução será minimizada.

EDIT: Eu estava tentando executar um trabalho ROBOCOPY e tentei o método nesta resposta e ele não funcionou, mesmo após a edição os privilégios de acesso à rede. Tentei clicar duas vezes no script e não consegui fazê-lo funcionar, mas apenas consegui executá-lo sob um prompt de comando elevado. Eu criei um atalho para o arquivo em lotes e o execute como Administrador e consegui executá-lo clicando duas vezes nele, mas o método com o qual acabei indo foi executá-lo oculto como SYSTEM (eu sei, eu sei) - mas funciona com ROBOCOPY, pelo que vale a pena, desde que o arquivo em lotes tenha as permissões corretas.

EDIT 2: Por algum motivo, não funcionaria como SYSTEM (provavelmente a coisa de acesso à rede mencionada anteriormente) - só notei isso depois de executar ROBOCOPY sem o sinalizador/L, que é basicamente apenas uma simulação e, aparentemente, não se conecta ao sistema remoto, mas quando executo o arquivo em lotes com maiores privilégios e marque a caixa oculta, posso ainda o execute como o usuário conectado em segundo plano, sem que seja exibida uma janela de comando, seja o que for que isso valha para alguém.

1
rubynorails

Outra solução que usei é Início oculto

0
SteveC