Esegui un file batch in modo completamente nascosto


139

Sto cercando un modo per eseguire un file batch (.bat) senza nulla di visibile all'utente (nessuna finestra, nessun nome della barra delle applicazioni, .etc ..).

Non voglio usare alcun programma per farlo, sto cercando qualcosa di più pulito. Ho trovato una soluzione che utilizza VBScript, ma non mi piace nemmeno usare VBS.


Haha! Sicuramente no. Sto sviluppando un servizio Windows che eseguirà un file batch di tanto in tanto.
Moayad Mardini,

4
I servizi di Windows non vengono eseguiti come file batch. Funzionano come servizi. Devi chiarire la domanda - come scritto e con commenti non ha senso per me.
CarlF,

1
Ho un servizio di Windows che esegue file batch. Non che il servizio sia un file batch.
Moayad Mardini,

1
In che lingua stai scrivendo il tuo servizio?
Hugh Allen,

c'è anche hstart.
barlop

Risposte:


119

Soluzione 1:

Salva questa riga di testo come file invisible.vbs:

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

Per eseguire in modo invisibile qualsiasi programma o file batch, utilizzalo in questo modo:

wscript.exe "C: \ Wherever \ invisible.vbs" "C: \ Some Other Place \ MyBatchFile.bat"

Per poter anche trasmettere / inoltrare un elenco di argomenti, utilizzare solo due virgolette doppie

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

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

Soluzione 2:

Utilizzare uno strumento da riga di comando per avviare silenziosamente un processo: Quiet , Hidecon o Hideexec .


2
Perché 4 virgolette doppie, potresti spiegare?
Starx,

E se avessimo bisogno di avviare un programma nascosto?
Starx,

5
Sintassi @Starx VB. &significa stringhe concatenate. Le stringhe sono racchiuse tra virgolette doppie ( "). Le virgolette doppie consecutive ( "") all'interno dei delimitatori di stringa indicano una doppia virgoletta letterale ( "). Quindi, quattro virgolette doppie ( """") sarebbero una stringa letterale di un carattere, una virgoletta doppia ( "). Mettilo insieme, e """" & WScript.Arguments(0) & """"diventerebbe "<argument>", dov'è <argument>il primo argomento della riga di comando passato allo script.
Bob,

4
Come modificarlo in modo che passi tutti gli argomenti? Sarebbe più conveniente passare gli argomenti senza citarli.
Ctrl-C

2
Non è ancora necessario creare un file batch per mettere l' wscript.exe "C:\Wherever\invisible.vbs" ...interno di?
endolito il

26

Per nascondere file batch o file di comandi o qualsiasi file .... Utilizzare l' IExpress.exeutilità integrata di Windows XP per creare un file .EXE dal file batch. Quando si utilizza IExpressassicurarsi di selezionare l'opzione nascosta Run e selezionare tutte le caselle per non mostrare nulla. Dopo aver creato il tuo .exe, posizionalo nella cartella dei comandi di esecuzione che scegli e non lo vedrai mai.


1
Oh, in realtà una buona soluzione.
Camilo Martin,

7
c'è qualcosa di equivalente a lexpress.exe nelle nuove versioni di Windows come Windows 7?
Sнаđошƒаӽ,

@ Sнаđошƒаӽ È in Windows 7 .... appena provato
DarthRubik

@DarthRubik Grazie per averlo condiviso. Anch'io l'ho provato e funziona benissimo. È ora di votare la risposta. :)
Sнаđошƒаӽ il

Questo non sembra funzionare su Windows 10 64 poiché "Command.com" non sembra più essere presente
Arne S

10

utilizzare Cmdow è un'utilità della riga di comando Win32 per NT4 / 2000 / XP / 2003 che consente di elencare, spostare, ridimensionare, rinominare, nascondere / non nascondere, disabilitare / abilitare, minimizzare, massimizzare, ripristinare, attivato / inattivato, chiuso, ucciso e Di Più.

Esegui un file batch nascosto passando i parametri: -

cmdow / run / hid mybat arg1 "arg 2"


Ma come avrei eseguito questo comando?
Moayad Mardini,

9
cmdow viene rilevato come malware dalla maggior parte dei prodotti antivirus. Quindi sarebbe difficile usare questa soluzione in luoghi diversi dal proprio PC.
Ganesh R.,

@Ganesh: una soluzione migliore?
Moayad Mardini,

È open source? Non ha senso usare un'app di terze parti che non è open source e potrebbe impacchettare trojan quando potresti fare la stessa cosa eseguendo il vbscript a 1 riga di harrymc (vedi la risposta nella parte superiore del thread).
thebunnyrules,

1
Bene, è open source, quindi è davvero fantastico. Puoi ottenere il codice sorgente qui: github.com/ritchielawrence/cmdow
thebunnyrules

9

Se il tuo file batch può adattarsi a una riga e a tanti caratteri, usa semplicemente un collegamento facendo clic con il pulsante destro del mouse all'interno di una cartella inserita in una directory casuale, salta il resto della procedura guidata e infine fai clic con il pulsante destro del mouse sul collegamento appena creato e fai clic su Proprietà e in Destinazione, inserisci ciò che di solito inseriresti in un file bat. E Bob tuo zio!

Professionisti:

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

Contro:

 Limited to one line, so many characters

L'unico problema è che non è possibile associare un tipo di file a un collegamento. Quindi, se si desidera aprire un file con uno script batch facendo doppio clic su di esso in Explorer, è comunque necessario un file .bat.
Björn Lindqvist,

Sto ancora cercando di trovare lo zio Bob, è qui dappertutto !!
Pimp Juice IT

7

Esegui lo script tramite un lavoro senza renderlo interattivo:

at 11:00 script.bat

Un'altra soluzione, se non ti dispiace installare qualcosa come Python, potresti semplicemente creare uno script ed eseguirlo con pythonw(la versione collegata per le operazioni della GUI). Dal momento che non stai utilizzando alcuna API grafica, la finestra non verrà visualizzata. Usa semplicemente le chiamate os.system()e imiterà uno script batch, poiché è lo stesso che digitare le stringhe nella riga di comando.

Esempio:

import os

os.system("tasklist > C:\tasks.txt")
os.system("ipconfig /all > C:\netinfo.log")

3
Ma come avrei eseguito questo comando?
Moayad Mardini,

Dovresti pianificare un'attività pianificata o scrivere un servizio.
Noce non finanziata

esempi aggiunti.
John T,


6

Utilizzando Windows7, è possibile utilizzare il pannello di controllo "Attività pianificate" per pianificare l'esecuzione in background di un file batch invisibile con autorizzazioni specificate e persino come account "SISTEMA". Vedi lo screenshot qui sotto:

inserisci qui la descrizione dell'immagine

Inoltre, sebbene con meno funzionalità, è anche possibile creare un'attività di script batch invisibile come questa dalla riga di comando utilizzando il comando "AT.exe" senza l'opzione "/ interattivo".


3
La casella di controllo nascosta nasconde l'attività dall'interfaccia utente di Utilità di pianificazione (
Sourav Ghosh,

Eseguire un'attività come "SISTEMA" quando non ha bisogno dei privilegi di "SISTEMA" (e non è stato esaminato per le debolezze di sicurezza e rafforzato) come una cattiva idea; vedi i commenti qui .
Scott

6

Non mi piace la soluzione VBScript.

Scarica e copia nircmd.exe nella tua %systemroot%\system32cartella, quindi aggiungi questo comando alla prima riga del batch:

nircmd.exe win hide ititle "cmd.exe"

oppure personalizza prima il titolo del tuo batch con il titlecomando per evitare di nascondere tutte le cmdfinestre, in questo modo:

title MyBatch
nircmd.exe win hide ititle "MyBatch"

Uso questo metodo esatto, ma per qualche tempo non sono riuscito a far sì che nircmd non nasconda la finestra cmd, sia solo ridotta a icona nella barra delle applicazioni e non possa essere ripristinata facendo clic su di essa. Non so perché ...
James Yang,


3

Puoi anche creare uno script AutoHotkey :

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

3

ANCORA UN ALTRO modo, da C / C ++, è usare la funzione CreateProcess con il flag CREATE_NO_WINDOW. Ha un sacco di potenza extra non mostrata qui. Questo è solo il minimo necessario per sostituire system () o la famiglia _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 );

1
Risposta corretta per l'approccio WINAPI. Ecco il codice sorgente e l'applicazione come aggiunta alla tua risposta.
Alex,

3

L'eccellente Bat To Exe Converter convertirà il tuo file .bato .cmdin un .exefile.

Ha una semplice interfaccia utente. Puoi scegliere di non avere una finestra della console selezionando l'opzione "Applicazione invisibile". Inoltre, consente di assegnare un'icona, i file associati al pacchetto e diverse altre opzioni.

Ecco uno screenshot della finestra dell'interfaccia principale:


Si noti che questa immagine non è aggiornata. Mostra la versione 2.4.8 e, a settembre 2018, il sito web offre la versione 3.0.10.0 (ultimo aggiornamento 2018-03-23).

Attenzione: il sito Web www.f2ko.de si collega a coinhive.com, che è ampiamente identificato come malware .


2

L'ho fatto con successo con nircmd in questo modo:

  1. scarica nircmd.exe dal link
  2. crea il tuo file .bat
  3. la prima riga del file .bat deve essere questa: nircmd.exe win hide ititle "cmd.exe"
  4. seleziona entrambi i file e crea un file autoestraente usando winrar
  5. nella scheda "generale", seleziona la casella "crea file autoestraente"
  6. nella scheda "anticipo" selezionare il pulsante "autoestraente"
  7. c'è una nuova finestra e selezionare la scheda "mode" quindi selezionare l'opzione: "nascondi tutto"
  8. seleziona la scheda "aggiorna" e seleziona l'opzione "sovrascrivi file esistenti"
  9. Seleziona la scheda "generale" e, se lo desideri, definisci una cartella di destinazione per l'estrazione e nella casella "Esegui dopo l'estrazione" scrivi il percorso completo in cui verrà estratto il tuo .bat. Ad esempio: se si definisce la cartella di estrazione come: "c: \ windows \", il percorso completo da eseguire dopo l'estrazione sarà: "c: \ windows \ file.bat" (nel caso in cui il tuo .bat sia chiamato: file.bat )
  10. fai clic su accetta su tutte le finestre

Ora avrai un file .exe che dopo averlo fatto doppio clic su di esso e installato, il tuo .bat verrà eseguito completamente nascosto.


1
cmdow /run /hid "file.extention" arg1 "arg 2"

3
Si prega di includere una breve spiegazione del comando. Ciò potrebbe aiutare l'OP (e altri) a capire come funziona invece di limitarsi a copiare il comando e utilizzarlo.
BloodPhilia,


'cmdow' is not recognized as an internal or external command, operable program or batch file.
Bacco,

1

Non è necessario fare alcuno speciale.

Se si eseguono i file batch da un servizio Windows, questi dovrebbero essere nascosti per impostazione predefinita a meno che non si abiliti l'opzione "Consenti al servizio di interagire con il desktop" sul servizio.


1

Aggiungendo la mia risposta qui da un altro post poiché era un duplicato e non vedo questa soluzione qui, quindi ora ci sono 17 risposte diverse su come è possibile eseguire un file batch nascosto. Eliminerò la mia risposta su quel post ad un certo punto nel prossimo futuro.

Crea lo script batch con la logica batch e i comandi in esso contenuti, quindi crea un nuovo file con .VBSestensione, utilizza la logica di seguito (esempio che ho fornito di seguito) e collega il percorso completo al tuo .CMDo al .BATfile con i PING -t <IPAddress>comandi, ecc. esegue il batch in modo nascosto non mostrando la finestra di comando quando viene eseguito.

Laddove la logica nell'esempio seguente specifica la C:\Folder\BatchFileName.cmdmodifica, quella di puntare allo script batch con i comandi in esecuzione manualmente, ecc. Ora.

Salvare il .VBSfile e pianificarlo con Task Scheduler Problemi di pianificazione di un'attività su Windows 7 per l'esecuzione su una pianificazione indefinita per le proprie esigenze.

Altrimenti, fai semplicemente doppio clic sul .VBSfile per eseguire il PINGcomando infinito che hai inserito nel file batch e lo punti come necessario.

NOTA: credo che sia da qui che ho ottenuto questa logica di script, ma funziona in modo affidabile per lo stesso scopo necessario qui, che è quello di garantire che la finestra di comando sia nascosta quando viene eseguito un file batch Origine errore server

ESEMPIO VBS SCRIPT RUN COMMAND LINE BATCH HIDING CMD WINDOW

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

1

Qui ho compilato tutti i modi che conosco per avviare un processo nascosto con batch senza strumenti esterni. Con uno script pronto all'uso (alcuni dei quali piuttosto ricchi di opzioni), e tutti formano la riga di comando. Dove è possibile anche il Viene restituito il PID. Gli strumenti utilizzati sono IEXPRESS, SCHTASKS, WScript.Shell, Win32_Process e JScript.Net


1

Nonostante abbia già risposto a questo, ecco un altro approccio. Il diverso è che lo script batch può nascondersi automaticamente durante l'esecuzione. Tuttavia, avrai bisogno di due script aggiuntivi: windowMode.bat e getCMDPid.bat (entrambi contengono .netcodice). Ecco come può essere utilizzato:

@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

0

Ho avuto lo stesso problema, ma ho capito:
Shell("filehere" & "parametersforbatchfilehere", vbHidden)


0

Ho iniziato a cercare di capirlo e non ci sono mai riuscito. Questo è stato il più vicino possibile:

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

0

Avevo bisogno di nascondere la finestra per un file batch chiamato da un menu di scelta rapida di Explorer e dovevo anche aggiungere virgolette al parametro. Nessuna delle risposte ha funzionato per me, quindi sto aggiungendo la mia soluzione.

Ho avuto questo sul "comando" del registro per un menu di scelta rapida di Explorer:

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

Quindi per sostituirlo ho dovuto creare un vbs come questo:

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

Salvare in un posto come C:\mypath\myscript.vbse chiamarlo così nel registro:

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

Si noti che il percorso .bat non può contenere spazi, quindi sostituirlo con il nome file 8.3. Quindi ad esempio si C:\Program Files\myprogram.batdeve fare riferimento a C:\Progra~1\myprogram.bat. Per vedere il nome del file 8.3 utilizzaredir /x


0

Sono stato creato RunApp per fare un simile lavoro e anche usarlo nel mio ambiente di produzione, spero che sia d'aiuto.

La configurazione come di seguito:

file: config.arg

:style:hidden

MyBatchFile.bat
arg1
arg2

E lancia runapp.exeinvece.


-1

Questo funziona per Windows 8 (forse altri)

  1. Creare un file batch come di consueto
  2. Creare un collegamento al file batch
  3. Fare clic con il tasto destro sul collegamento> proprietà
  4. Fai clic su Layout
  5. Deseleziona "Lascia finestra di sistema"
  6. imposta la posizione a sinistra tp -1000
  7. fai clic su applica

  8. Fai clic sul collegamento e verrà eseguito ma non lo vedrai :)


4
Veramente? Questo non verrà mostrato come un pulsante sulla barra delle applicazioni?
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.