Execute um arquivo em lotes de uma maneira completamente oculta

139

Estou procurando uma maneira de executar um arquivo em lotes (.bat) sem nada visível para o usuário (sem janela, sem nome da barra de tarefas, .etc ..).

Eu não quero usar algum programa para fazer isso, estou procurando algo mais limpo. Encontrei uma solução que usa VBScript, mas também não gosto muito de usar o VBS.

Moayad Mardini
fonte
Haha! Definitivamente não. Estou desenvolvendo um serviço do Windows que executará um arquivo em lotes de vez em quando.
Moayad Mardini 29/10/09
4
Os serviços do Windows não são executados como arquivos em lote. Eles funcionam como serviços. Você precisa esclarecer a pergunta - conforme escrito e com comentários, não faz sentido para mim.
29809 CarlF
1
Eu tenho um serviço do Windows que executa arquivos em lote. Não que o serviço seja um arquivo em lotes.
Moayad Mardini 29/10/09
1
Em que idioma você está escrevendo seu serviço?
Hugh Allen
também há hstart.
barlop

Respostas:

119

Solução 1:

Salve esta linha de texto como arquivo invisible.vbs:

CreateObject ("Wscript.Shell"). Execute "" "" & WScript.Arguments (0) & "" "", 0, False

Para executar qualquer programa ou arquivo em lote invisivelmente, use-o assim:

wscript.exe "C: \ Wherever \ invisible.vbs" "C: \ Algum outro lugar \ MyBatchFile.bat"

Para também poder transmitir / retransmitir uma lista de argumentos, use apenas duas aspas duplas

CreateObject ("Wscript.Shell"). Execute "" & WScript.Arguments (0) & "", 0, False

Exemplo: Invisible.vbs "Kill.vbs ME.exe"

Solução 2:

Use uma ferramenta de linha de comando para iniciar silenciosamente um processo: Silencioso , hidecon ou hideexec .

harrymc
fonte
2
Por que 4 aspas duplas, você poderia explicar?
Starx 28/07
E se precisássemos iniciar um programa oculto?
Starx 28/07
5
@Starx VB sintaxe. &significa concatenar cadeias. As cadeias são colocadas entre aspas duplas ( "). Aspas duplas consecutivas ( "") dentro dos delimitadores de cadeia de caracteres significam aspas duplas literais ( "). Portanto, quatro aspas duplas ( """") seriam uma string literal de um caractere, aspas duplas ( "). Coloque tudo junto e """" & WScript.Arguments(0) & """"se tornará "<argument>", onde <argument>está o primeiro argumento da linha de comando passado para o script.
21412 Bob
4
Como modificá-lo para que ele passe todos os argumentos? Seria mais conveniente passar os argumentos sem citá-los.
Ctrl-C
2
Isso ainda não exige que você crie um arquivo em lotes para colocar o wscript.exe "C:\Wherever\invisible.vbs" ...interior?
Endolith
26

Para ocultar arquivos em lotes ou arquivos de comando ou qualquer arquivo ... Use o IExpress.exeutilitário interno do Windows XP para criar um arquivo .exe do arquivo em lotes. Ao usar, IExpressverifique a opção executar oculto e marque todas as caixas sobre não mostrar nada. Depois de criar o seu .exe, coloque-o na pasta de comando de execução que você escolher e você nunca o verá aparecer.

Paul Cheselske
fonte
1
Oh, boa solução, na verdade.
Camilo Martin
7
existe algo equivalente ao lexpress.exe em versões mais recentes do Windows como o Windows 7?
Sнаđошƒаӽ
@ Sнаđошƒаӽ Está no windows 7 .... acabou de testar #
DarthRubik
@DarthRubik Obrigado por compartilhar isso. Eu também testei e funciona muito bem. Hora de votar a resposta. :)
Sнаđошƒаӽ
Isso não parece funcionar no Windows 10 64 desde o "Command.com" já não parece estar presente
Arne S
10

use Cmdow é um utilitário de linha de comando do Win32 para NT4 / 2000 / XP / 2003 que permite que as janelas sejam listadas, movidas, redimensionadas, renomeadas, ocultas / não-ocultas, desabilitadas / habilitadas, minimizadas, maximizadas, restauradas, ativadas / inativadas, fechadas, eliminadas e excluídas. Mais.

Execute um arquivo em lotes oculto passando os parâmetros: -

cmdow / executar / ocultou mybat arg1 "arg 2"

Joe
fonte
Mas como eu executaria esse comando?
Moayad Mardini 29/10/09
9
O cmdow é detectado como malware pela maioria dos produtos antivírus. Por isso, seria difícil usar esta solução em outros lugares que não o seu PC.
29709 Ganesh R.
@ Ganesh: Alguma solução melhor?
Moayad Mardini 29/10/09
É de código aberto? Não faz sentido usar um aplicativo de terceiros que não seja de código aberto e possa estar carregando trojans quando você pode fazer a mesma coisa executando o vbscript de 1 linha do harrymc (veja a resposta na parte superior do tópico).
thebunnyrules
1
Bem, é de código aberto, então isso é incrível. Pode obter o código fonte aqui: github.com/ritchielawrence/cmdow
thebunnyrules
9

Se o seu Arquivo em lote pode caber em uma linha e em tantos caracteres, basta usar um atalho clicando com o botão direito do mouse dentro de uma pasta colocada em um diretório aleatório e pular o restante do assistente e, por último, clicar com o botão direito do mouse no atalho recém-criado e Clique em Propriedades e, no destino, insira o que você normalmente colocaria em um arquivo bat. E Bobs seu tio!

Prós:

 No Command Window
 Ability to use an icon
 Same Functionality of bat file

Contras:

 Limited to one line, so many characters
Jack S
fonte
O único problema é que você não pode associar um tipo de arquivo a um atalho. Portanto, se você deseja abrir um script em lote clicando duas vezes nele no explorer, ainda precisa de um arquivo .bat.
Björn Lindqvist
Ainda estou tentando encontrar o tio Bob, está aqui em qualquer lugar !!
Pimp Juice IT
7

Execute o script por meio de um trabalho at sem torná-lo interativo:

at 11:00 script.bat

Outra solução, se você não se importa em instalar algo como Python, pode simplesmente criar um script e executá-lo pythonw(a versão vinculada para operações da GUI). Como você não está usando nenhuma API gráfica, a janela não será exibida. Basta usar chamadas para os.system()e ele imitará um script em lote, pois é o mesmo que digitar as strings na linha de comando.

Exemplo:

import os

os.system("tasklist > C:\tasks.txt")
os.system("ipconfig /all > C:\netinfo.log")
John T
fonte
3
Mas como eu executaria esse comando?
Moayad Mardini 29/10/09
Você precisaria agendar uma tarefa agendada ou gravar um serviço.
Unfundednut
exemplos adicionados.
John T
6

Você pode executá-lo minimizado facilmente.

start /MIN batch.cmd
Brad Gilbert
fonte
3
ou use / B em vez disso!
rany
6

Usando o Windows7, você pode usar o painel de controle "Tarefa agendada" para agendar um arquivo em lotes para execução invisível em segundo plano com permissões especificadas e até mesmo como a conta "SISTEMA". Veja a captura de tela abaixo:

insira a descrição da imagem aqui

Além disso, embora com poucos recursos, você também pode criar uma tarefa de script em lote invisível como esta na linha de comando usando o comando "AT.exe" sem a opção '/ Interactive'.

djangofan
fonte
3
A caixa de seleção Oculto apenas oculta a tarefa da interface do usuário do Agendador de Tarefas (
Sourav Ghosh
Executar uma tarefa como "SISTEMA" quando não precisar de privilégios de "SISTEMA" (e não tiver sido analisado quanto a pontos fracos de segurança e reforçado) como uma má idéia; veja os comentários aqui .
Scott
6

Eu não gosto da solução VBScript.

Faça o download e copie o nircmd.exe para sua %systemroot%\system32pasta e adicione este comando à primeira linha do seu lote:

nircmd.exe win hide ititle "cmd.exe"

ou torne seu título de lote personalizado primeiro com o titlecomando para evitar ocultar todas as cmdjanelas, assim:

title MyBatch
nircmd.exe win hide ititle "MyBatch"
BijaN-R
fonte
Eu uso esse método exato, mas falhei por algum tempo que o nircmd não oculta a janela do cmd, apenas minimizado na barra de tarefas e não pode ser restaurado clicando nele. Não sei porque ...
James Yang
3

Você também pode criar um script AutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 
endólito
fonte
3

De outra maneira, a partir do C / C ++, é usar a função CreateProcess com o sinalizador CREATE_NO_WINDOW. Tem muita energia extra não mostrada aqui. Este é apenas o mínimo necessário para substituir system () ou a família _spawn ().

STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);

PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );

// Spawn creates a cmd.exe window.  CreateProcess doesn't.
//if ( _spawnl( _P_WAIT, szFileNameBAT, szFileNameBAT, NULL ) ) {  
if ( !CreateProcess( szFileNameBAT, szFileNameBAT, NULL, NULL, false,
                     CREATE_NO_WINDOW, NULL, NULL, &si, &pi  ) ) {
  MyErrorFunc( "CreateProcess( \"%s\" ): %d", szFileNameBAT, GetLastError() );
  goto MyErrorHandling;
}

WaitForSingleObject( pi.hProcess, INFINITE );

CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
Franco suíço
fonte
1
Resposta correta para a abordagem WINAPI. Aqui está o código-fonte e o aplicativo como complemento à sua resposta.
Alex
3

O excelente Bat To Exe Converter converterá seu arquivo .batou .cmdem um .exearquivo.

Ele tem uma interface simples. Você pode optar por não ter uma janela do console selecionando a opção "Aplicativo invisível". Além disso, permite atribuir um ícone, compactar arquivos associados e várias outras opções.

Aqui está uma captura de tela da janela principal da interface:


Observe que esta imagem está desatualizada. Ele mostra a versão 2.4.8 e, a partir de setembro de 2018, o site oferece a versão 3.0.10.0 (última atualização em 23/03/2018).

Atenção: o site www.f2ko.de possui um link para o site coinhive.com, amplamente identificado como malware .

BullyWiiPlaza
fonte
2

Fiz isso com sucesso com o nircmd desta maneira:

  1. faça o download do nircmd.exe a partir do link
  2. crie seu arquivo .bat
  3. a primeira linha do arquivo .bat deve ser esta: nircmd.exe win hide ititle "cmd.exe"
  4. selecione os dois arquivos e crie um arquivo de extração automática usando o winrar
  5. na guia "geral", marque a caixa "criar arquivo de extração automática"
  6. na guia "avançar", selecione o botão "extração automática"
  7. existe uma nova janela e selecione a guia "mode" e selecione a opção: "hide everything"
  8. selecione a guia "atualizar" e selecione a opção "substituir arquivos existentes"
  9. Selecione a guia "geral" e defina uma pasta de destino para extração, se desejar, e na caixa "Executar após extração", escreva o caminho completo onde seu .bat será extraído. Ex: se você definir a pasta de extração como: "c: \ windows \", o caminho completo para a extração após a extração será: "c: \ windows \ file.bat" (no caso do seu .bat ser nomeado: file.bat )
  10. clique em aceitar em todas as janelas

Agora você terá um arquivo .exe que, depois de clicar nele e instalá-lo, seu arquivo .bat será totalmente oculto.

ZEUS
fonte
1
cmdow /run /hid "file.extention" arg1 "arg 2"
malak
fonte
3
Por favor, inclua uma breve explicação do comando. Isso pode ajudar o OP (e outros) a entender como ele funciona, em vez de apenas copiar o comando e usá-lo.
precisa saber é o seguinte
'cmdow' is not recognized as an internal or external command, operable program or batch file.
23
1

Você não precisa fazer nenhum especial.

Se você estiver executando os arquivos em lotes de um serviço do Windows, eles deverão estar ocultos por padrão, a menos que você ative a opção "Permitir que o serviço interaja com a área de trabalho" no serviço.

sgmoore
fonte
1

Adicionando minha resposta aqui de outro post, já que era uma duplicata e não vejo essa solução aqui, agora existem 17 respostas diferentes para como você pode executar um arquivo em lotes oculto. Excluirei minha resposta nesse post em algum momento no futuro próximo.

Crie seu script em lote com sua lógica e comandos em lote e, em seguida, crie um novo arquivo com .VBSextensão, use a lógica abaixo (exemplo que forneci abaixo) e basta conectar o caminho completo ao seu arquivo .CMDou .BATcom os PING -t <IPAddress>comandos, etc. para ele executa o lote de maneira oculta, sem mostrar a janela de comando quando é executado.

Onde a lógica no exemplo abaixo especifica a C:\Folder\BatchFileName.cmdalteração que aponta para o script em lote com seus comandos que você está executando manualmente, etc. agora.

Salve o .VBSarquivo e programe-o com Task Scheduler Problemas ao agendar uma tarefa no windows7 para executar em um agendamento indefinido para suas necessidades.

Caso contrário, basta clicar duas vezes no .VBSarquivo para executar o PINGcomando infinito que você coloca no arquivo em lotes para o qual você aponta.

NOTA: Eu acredito que este é onde eu tenho essa lógica de script a partir mas funciona de forma confiável para a mesma finalidade que precisa aqui, que é o de assegurar a janela de comando estiver oculto quando um arquivo de lote é executado Servidor Fonte Fault

EXEMPLO VBS SCRIPT EXECUTAR JANELA DE LOTE DE COMANDO DA LINHA DE COMANDO

Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Folder\BatchFileName.cmd" & Chr(34), 0
Set WinScriptHost = Nothing
Pimp Juice IT
fonte
1

Aqui eu compilei todas as maneiras que eu conheço para iniciar um processo oculto com lote sem ferramentas externas. Com scripts prontos para usar (alguns deles bastante ricos em opções) e todos eles formam a linha de comando. O PID é retornado. As ferramentas usadas são IEXPRESS, SCHTASKS, WScript.Shell, Win32_Process e JScript.Net

npocmaka
fonte
1

Apesar de eu já ter respondido isso, aqui está outra abordagem. A diferença é que o script em lote pode se auto-ocultar durante a execução. Você precisará de dois scripts adicionais - windowMode.bat e getCMDPid.bat (ambos contêm .netcódigo). Aqui como então pode ser usado:

@echo off
call getCmdPid
call windowMode -pid %errorlevel% -mode hidden

echo this should be written into log despite the cmd window is hidden>log
echo ending the log>>log
exit
npocmaka
fonte
0

Eu tive o mesmo problema, mas descobri:
Shell("filehere" & "parametersforbatchfilehere", vbHidden)

Alan Panayotov
fonte
0

Comecei a tentar descobrir isso e nunca realmente consegui. Foi o mais perto que cheguei:

@echo off
if not defined PIL (
    set PIL=1
    start /min "" %~0
    exit /b
)
TITLE Hello World
echo Hello world!
pause>nul
djangofan
fonte
0

Eu precisava ocultar a janela para um arquivo em lotes chamado de um menu de contexto do explorer e também adicionar aspas no parâmetro. Nenhuma das respostas funcionou para mim, então estou adicionando minha própria solução.

Eu tinha isso no registro "comando" para um menu de contexto do Explorer:

cmd /c C:\mypath\myprogram.bat "%1"

Então, para substituí-lo, tive que criar um vbs como este:

WScript.CreateObject ("WScript.shell").run "cmd /c C:\mypath\myprogram.bat """ & WScript.Arguments(0) & """", 0, False

Salve em um local como C:\mypath\myscript.vbse chame-o assim no registro:

wscript "C:\mypath\myscript.vbs" "%1"

Observe que o caminho .bat não pode ter espaços, então substitua-o pelo nome do arquivo 8.3. Por exemplo C:\Program Files\myprogram.bat, deve ser referenciado como C:\Progra~1\myprogram.bat. Para ver o nome do arquivo 8.3, usedir /x

bortao
fonte
0

Eu criei o RunApp para fazer esse trabalho e também usá-lo no meu ambiente de produção. Espero que ajude.

A configuração como abaixo:

arquivo: config.arg

:style:hidden

MyBatchFile.bat
arg1
arg2

E inicie runapp.exe.

James Yang
fonte
-1

Isso funciona para o Windows 8 (possivelmente outros)

  1. Crie um arquivo em lotes normalmente
  2. Crie um atalho para o arquivo em lotes
  3. Clique com o botão direito do mouse no atalho> propriedades
  4. Clique em Layout
  5. Desmarque "Deixe a janela de posição do sistema"
  6. definir posição esquerda tp -1000
  7. clique em aplicar

  8. Clique no atalho e ele será executado, mas você não o verá :)

Andrew
fonte
4
Realmente? Isso não será exibido como um botão na barra de tarefas?
Scott Scott