Como executar um arquivo em lotes sem iniciar uma "janela de comando"? [duplicado]

131

Esta pergunta já tem uma resposta aqui:

No Windows XP, posso executar um arquivo em lotes (.bat ou .cmd), por meio de um atalho, sem uma "janela preta"?

dugres
fonte
6
Você está perguntando se pode impedir que a janela de comando apareça quando você executa um arquivo bat?
Eric
6
Sim, você pode alterar facilmente a cor padrão da janela de saída usando as propriedades em um atalho de cmd.exe. (sim isso é uma piada ...)
Toby J

Respostas:

86

Salve o seguinte como wscript, por exemplo, hidecmd.vbs após substituir "testing.bat" pelo nome do arquivo em lote.

Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c testing.bat"
oShell.Run strArgs, 0, false

O segundo parâmetro de oShell.Runé o intWindowStylevalor que indica a aparência da janela do programa e o valor zero é para a janela oculta.

A referência está aqui http://msdn.microsoft.com/en-us/library/d5fk67ky.aspx

Sharjeel Aziz
fonte
A terceira linha seria: strArgs = "cmd / c FILEPATH \ testing.bat"?
Dan Z
11
Alguma maneira de executar o bastão no modo elevado enquanto permanece invisível?
Laurens Swart
Como executar o .batarquivo como administartor usando este método?
Mehdi Dehghani
44

Esta é apenas uma simplificação da resposta de Shaji. Você pode executar seu script em lote por meio de um script VBScript (.vbs) como este:

'HideBat.vbs
CreateObject("Wscript.Shell").Run "your_batch_file.bat", 0, True

Isso executará seu arquivo em lotes sem nenhuma janela de comando mostrada.

bisavô
fonte
Como executar o .batarquivo como administrador usando este método?
Mehdi Dehghani
Propriedades @MehdiDehghani> segurança> execute como administrador. Se isso só funciona para exe ou aplicativos, então tudo bem.
TaylorS 24/06
21

Apenas para expandir as respostas "Usar scripts do Windows" (que considero melhores porque já estão incorporadas), veja como fazê-lo usando um único script de wrapper e passando o nome do arquivo em lotes "real" como parâmetro. Parâmetros adicionais serão transmitidos para o arquivo em lotes.

If WScript.Arguments.Count >= 1 Then
    ReDim arr(WScript.Arguments.Count-1)
    For i = 0 To WScript.Arguments.Count-1
        Arg = WScript.Arguments(i)
        If InStr(Arg, " ") > 0 Then Arg = """" & Arg & """"
      arr(i) = Arg
    Next

    RunCmd = Join(arr)
    CreateObject("Wscript.Shell").Run RunCmd, 0, True
End If

Por exemplo, salve o arquivo acima como em NoShell.vbsalgum lugar e chame:

NoShell.vbs c:\foo\my_batch_file.bat

Por fim, se você estiver procurando executá-lo em algum lugar que não entenda o arquivo .vbs (como "Ferramentas Externas" no Visual Studio), convém chamar C:\Windows\System32\wscript.exeo arquivo vbs como seu primeiro parâmetro e o seu arquivo em lotes como o segundo.

Toby J
fonte
6
Para aqueles que não gostam da idéia e do conceito de ter que criar um novo arquivo vbs para cada novo arquivo bat que ele cria, como é necessário usar uma das duas principais respostas, esta é a solução perfeita. Em vez de vários arquivos vbs, você terá vários atalhos. Para cada novo arquivo bat, crie um atalho para o arquivo vbs, clique com o botão direito do mouse, escolha Propriedades> guia Atalhos e, na caixa Destino, insira o caminho do arquivo bat após o caminho que já existe, como mostrado acima ou como isso se o atalho não está no mesmo lugar que o arquivo vbs: "C:\My Files\HideCmd.vbs" c:\foo\my_batch_file.bat.
Rolo 10/09
Se o caminho do arquivo bat tiver um espaço, como ele pode ser chamado através de um atalho para o arquivo vbs? Por exemplo: "C:\My Files\HideCmd.vbs" c:\my things\my_batch_file.bat. Não importa o que eu tente para o caminho - aspas duplas em torno de tudo,% 20 no lugar do espaço ou uma combinação desses dois, nada funciona. Recebo uma mensagem de erro informando que o arquivo não pode ser encontrado ou que nada acontece. Isso ocorre devido a erro do usuário do meu lado, uma limitação do Windows com o campo Destino para atalhos ou um problema com o script vbs no qual ele não manipula os caminhos de arquivos com espaços corretamente?
Rolo 10/09
@Rolo Atualizei o script para que, se algum dos parâmetros recebidos tiver espaços, ele os cercará entre aspas. Portanto, você deseja agrupar o caminho para o arquivo em lotes entre aspas ao chamá-lo; então, ele será considerado um único argumento e voltará a envolver antes de ser chamado.
Toby J
9

Você pode alterar as propriedades do atalho para executar minimizadas.

Para executá-lo completamente invisível, você precisará de outra coisa, como scripts do Windows.

cerveja
fonte
11
Sua primeira sugestão é a que sempre fiz.
martineau
8

Use start com a opção '/ B'. Por exemplo:

@echo off
start /B go.bat
zaf
fonte
25
start /bapenas executará o programa no console alocado no momento em vez de gerar um novo. De qualquer forma, você receberá um novo, já que o lote precisa ser executado com o cmd (que, por sua vez, [surpresa], abre um console).
Joey
@ Joey sim, mas isso é muito útil para iniciar arquivos em lote de outros aplicativos através da execução do shell (como SYSTEMem C / C ++).
Tomáš Zato
11
@ TomášZato: Você pode simplesmente chamar o arquivo em lote diretamente nesse caso, ou, se o que você usar para gerar um processo não criar um shell primeiro, use cmd /c foo.cmd. Não há absolutamente nenhuma necessidade de usar startnesses cenários e, eu diria que systemnão deve ser usado a favor CreateProcess. Ao iniciar um arquivo em lote, você já depende de uma plataforma; também pode usar as melhores ferramentas para o trabalho.
Joey
@ Joey Muito obrigado, nunca ouvi falar cmd /cantes. O comando cmd é o que eu precisava no meu caso, mas todas as respostas Stackexchange eu encontrei até agora, cerca de um arquivo de lote executando outro arquivo de lote, têm respostas superiores para usar início ...
T_d
start /b go.bat não alocará um novo console (ou seja, uma instância do conhost.exe - ou um encadeamento no csrss.exe antes do Windows 7). No entanto, isso fará uma bagunça, pois o script em lote é executado com uma nova instância do cmd.exe anexada ao mesmo console . Ambas as instâncias do shell competirão para ler as entradas do console, normalmente alternadas. Ele precisa /w(por exemplo start /b /w go.bat) para aguardar a segunda instância, que é semelhante ao uso cmd /cse estiver usando system. Além disso, se você estiver ligando CreateProcess, execute go.batdiretamente. Não há necessidade cmd /c.
Eryk Sun
6

Código aberto GPL gratuito "Criar processo oculto"

http://www.commandline.co.uk/chp/

O Microsoft Security Essentials e provavelmente a maioria dos outros scanners de vírus / malware tratam o executável, chp.exe, como um vírus, porque oculta qualquer programa que você especificar exibindo uma janela ou um botão da barra de tarefas, assim como os vírus.

Não é um vírus. Ele não esconde que o processo de destino apareça no gerenciador de tarefas, por exemplo. E é claro que o código fonte está incluído para que você possa ver que é muito pequeno e não faz nada além de executar o programa que você fornecer.

Você nem precisa confiar que o chp.exe incluído foi realmente criado a partir dessa fonte. Você pode descartar o chp.exe incluído e compilar o seu a partir da fonte, e todas as ferramentas necessárias para fazer isso são gratuitas e podem ser baixadas.


Você também pode simplesmente criar um atalho para o arquivo .bat ou .cmd e clicar com o botão direito do mouse no atalho, Propriedades, guia Atalho, Executar: Minimizado. Em tarefas agendadas, use o atalho em vez do arquivo .bat / .cmd diretamente. Isso impedirá que uma janela seja exibida, mas um botão da barra de tarefas ainda aparecerá.

bkw
fonte
6

Você pode usar scripts de janela como o AutoIt .

Como exemplo, basta escrever isso no editor de script AutoIt. É bem simples

Run("C:\test\batchfile.bat", "", @SW_HIDE)

Se você deseja executá-lo em um loop,

$x=0
Do
 Run("C:\test\batchfile.bat", "", @SW_HIDE)
 Sleep(5000)
Until $x = 1

Compile-o como .exe - e pronto.


Da mesma forma, na AutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 
Adrian Yeoh
fonte
5

Usar início oculto (custa US $ 20)

Início oculto - Execute aplicativos e arquivos em lote sem uma janela do console ou prompt do UAC

Aplicativos de console e arquivos em lote são executados regularmente na inicialização do Windows ou em um agendamento. O principal inconveniente disso é que cada aplicativo abre uma janela do console que pisca na tela. O Hidden Start (ou Hstart) é um utilitário leve de linha de comando que permite executar aplicativos de console e arquivos em lote sem nenhuma janela em segundo plano, lidar com a elevação de privilégios de UAC no Windows 7 e Vista, iniciar vários comandos em paralelo ou de forma síncrona e muito mais .

insira a descrição da imagem aqui

Kyle A
fonte
Esta é uma aplicação muito bem projetada e útil.
Guru Josh
5

Solução simples, sem usar nenhum programa extra.

  1. Crie o arquivo em lotes que você deseja executar e teste.
  2. Crie um atalho para ele.
  3. Edite as propriedades do atalho: na guia Atalho, escolha Executar minimizado. Atribua uma tecla de atalho e pronto!

Boa sorte!

Willem
fonte
7
Esta não é uma solução para o problema do OP. Há uma diferença entre minimizar e esconder
nixda 27/10
Se você alterar o atalho para usar o ícone certo, o respingo minimizado na barra de tarefas é na verdade um bom lembrete de que algo está começando.
Quem foi
Essa é uma solução agradável e limpa para o meu problema! Obrigado!
dmitry_romanov
minimizando ... hehe.
gumuruh