Questão Como executar um arquivo em lotes sem iniciar uma “janela de comando”? [duplicado]


Esta questão já tem uma resposta aqui:

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


121


origem


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


Respostas:


Salve o seguinte como wscript, por exemplo, hidecmd.vbs após substituir "testing.bat" pelo nome do seu arquivo de 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 é intWindowStyle valor indicando a aparência da janela do programa e o valor zero é para a janela oculta.

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


83



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


Isto é apenas uma simplificação da resposta de Shaji. Você pode executar seu script em lote através de VBScript (.vbs) script como este:

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

Isto irá executar o seu arquivo de lote sem janela de comando mostrada.


41



Como correr .bat arquivo como administrador usando este método? - Mehdi Dehghani


Apenas para expandir as respostas "Usar o Windows Scripting" (que considero melhor já que já está incorporado), veja como fazer isso usando um único script de wrapper e passando o nome do arquivo de lote "real" como um parâmetro. Parâmetros adicionais serão passados ​​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

Então, por exemplo, salve o arquivo acima como NoShell.vbs em algum lugar, em seguida, ligue:

NoShell.vbs c:\foo\my_batch_file.bat

Finalmente, se você estiver procurando executar isso de algum lugar que não entende o arquivo .vbs (como um "Ferramentas Externas" no Visual Studio), você vai querer chamar C:\Windows\System32\wscript.exe com o arquivo vbs como seu primeiro parâmetro e seu arquivo de lote como o segundo.


18



Para aqueles que não gostam da idéia e conceito de ter que criar um novo arquivo vbs para cada novo arquivo bat criado, como se deve 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 do arquivo vbs, clique com o botão direito nele, escolha propriedades> guia Atalhos, e na caixa Destino digite o caminho do arquivo bat após o caminho que já está lá, como mostrado acima ou como isto se o atalho não estiver no mesmo lugar que o arquivo vbs: "C:\My Files\HideCmd.vbs" c:\foo\my_batch_file.bat. - Rolo
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 dizendo que o arquivo não pode ser encontrado ou nada acontece. Isso é devido a erro do usuário no meu final, uma limitação do Windows com o campo de destino para atalhos ou um problema com o script vbs no qual ele não manipula os caminhos de arquivo com espaços corretamente? - Rolo
@Rolo Eu atualizei o script para que, se algum dos parâmetros de entrada tiver espaços, ele os coloque entre aspas. Então você vai querer quebrar o caminho para o arquivo em lotes com aspas ao chamá-lo, então será considerado um único argumento e re-wrap antes de ser chamado. - Toby J


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

Para executá-lo de forma completamente invisível, você precisará de algo como o Windows Scripting.


9



Sua primeira sugestão é a maneira que sempre fiz. - martineau


Usar começar com a opção '/ B'. Por exemplo:

@echo off
start /B go.bat

8



start /bapenas executará o programa no console atualmente alocado em vez de gerar um novo. Você obterá um novo mesmo assim, já que o lote deve rodar com 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 de shell (como SYSTEM em C / C ++). - Tomáš Zato
@ TomášZato: Você pode apenas chamar o arquivo em lote diretamente nesse caso, ou, se o que você usa para gerar um processo não criar um shell primeiro, use cmd /c foo.cmd. Não há absolutamente nenhuma necessidade de usar start nesses cenários, e, eu diria que system não deve ser usado em favor de CreateProcess. Ao iniciar um arquivo de lote, você já depende de uma plataforma e pode usar as melhores ferramentas para o trabalho. - Joey
@Joey Graças a um monte, nunca ouvi falar de cmd /c antes. O comando cmd é o que eu precisava no meu caso, mas todas as respostas do stackexchange que eu encontrei até agora, sobre um arquivo de lote executando outro arquivo de lote, tem as principais respostas para usar o start ... - T_D
start /b go.bat  não vou alocar um novo console (por exemplo, uma instância do conhost.exe - ou um thread 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 que está anexada ao mesmo console. Ambas as instâncias do shell competirão para ler a entrada do console, normalmente alternando. Precisa /w (por exemplo. start /b /w go.bat), a fim de esperar na segunda instância, que é semelhante ao uso de cmd /c se usando system. Além disso, se você está ligando CreateProcess, corre go.bat diretamente. Não há necessidade de cmd /c. - eryksun


Fonte aberta GPL livre "Criar processo oculto"

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

O Microsoft Security Essentials, e provavelmente a maioria dos outros verificadores de vírus / malwares, tratará o executável, chp.exe, como um vírus, pois oculta qualquer programa que você especifique ao exibir uma janela ou um botão da barra de tarefas, da mesma forma que os vírus.

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

Você nem precisa confiar que o chp.exe incluído realmente foi criado a partir dessa fonte. Você pode ir em frente e descartar o chp.exe incluído e compilar o seu próprio a partir da fonte, e todas as ferramentas necessárias para fazê-lo são ainda gratuitas e podem ser baixadas.


Você também pode apenas criar um atalho para o arquivo .bat ou .cmd, 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 apareça, mas um botão da barra de tarefas ainda aparecerá.


6





Usar Início oculto  (custa US $ 20)

Início oculto - executar aplicativos e arquivos em lotes 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 de linha de comando leve que permite executar aplicativos de console e arquivos em lote sem janelas em segundo plano, manipular a elevação de privilégios do UAC no Windows 7 e Vista, iniciar vários comandos em paralelo ou em sincronia e muito mais .

enter image description here


5



Este é um aplicativo muito bem projetado e útil. - Guru Josh


Você pode usar scripts de janela como AutoIt.

Por exemplo, apenas escreva isso no editor de scripts AutoIt. É bastante simples

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

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

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

Compile como .exe - e você está feito.


Da mesma forma, AutoHotkey:

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

5





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

  1. Crie o arquivo de lote que você deseja executar e teste-o.
  2. Creata um atalho para isso!
  3. Edite as propriedades do atalho: na aba Atalho, escolha Executar Minimizado. Assumindo uma tecla de atalho para ele e seu feito!

Boa sorte!


4



Esta não é uma solução para o problema do OP. Há uma diferença entre Minimizando e Se escondendo - nixda
Se você alterar o atalho para usar o ícone correto, o splash minimizado na barra de tarefas é, na verdade, um bom lembrete de que algo está sendo iniciado. - Whoever
Essa é uma solução legal e limpa para meu problema! Obrigado! - dmitry_romanov
minimizando ... hehe. - gumuruh