Windows XP o successivo Windows: come posso eseguire un file batch in background senza che sia visualizzata alcuna finestra?


121

So di aver già risposto a una domanda simile ( Esecuzione di file batch in background all'avvio di Windows ), ma questa volta devo avviare un batch:

  • da un altro lotto,
  • senza alcuna finestra della console visualizzata,
  • con tutti gli argomenti passati al batch invisibile.

Il primo batch viene eseguito in una finestra della console. Tuttavia, non voglio che il secondo batch (avviato dal primo in modo asincrono ) visualizzi anche una finestra della console.

Ho escogitato uno script VBScript che fa proprio questo, e ho messo lo script come risposta a cui gli altri possono fare riferimento , ma se hai altre idee / soluzioni, sentiti libero di contribuire.

Nota: la finestra della console del processore dei comandi di Windows è chiamata finestra DOS non propriamente corretta da molte persone.


Grazie a tutti per le risposte. Da quello che ho capito, se ho bisogno di chiamare in modo asincrono uno script da eseguire in modalità invisibile:

  • Da un secondo script già in una finestra della console, start /bè sufficiente.
  • Da Windows, senza attivare una seconda finestra , la mia soluzione è ancora valida.

Stai avviando il file batch da UN ALTRO file batch? Questo file batch già in esecuzione ha una finestra?
Oddthinking

Sì, questo altro (primo) batch viene eseguito in una finestra DOS. Tuttavia, non voglio che il secondo batch (lanciato dal primo in modo asincrono) visualizzi anche una finestra (cosa che avverrebbe con un comando 'start / b')
VonC

Risposte:


53

È necessario che il secondo file batch venga eseguito in modo asincrono? In genere un file batch ne esegue un altro in modo sincrono con il callcomando e il secondo condivide la finestra del primo.

È possibile utilizzare start /b second.bat per avviare un secondo file batch in modo sincrono dal primo che condivide la finestra del primo. Se entrambi i file batch scrivono contemporaneamente nella console, l'output sarà sovrapposto e probabilmente indecifrabile. Inoltre, ti consigliamo di inserire un exitcomando alla fine del tuo secondo file batch, o sarai all'interno di una seconda cmdshell una volta che tutto è finito.


1
Corretta. Credevo che start / b avrebbe aperto una nuova finestra, ma se eseguito da una finestra DOS, condivide le stesse finestre.
VonC

110

Ecco una possibile soluzione:

Dal tuo primo script, chiama il tuo secondo script con la seguente riga:

wscript.exe invis.vbs run.bat %*

In realtà, stai chiamando uno script vbs con:

  • il [percorso] \ nome del tuo script
  • tutti gli altri argomenti necessari al tuo script ( %*)

Quindi, invis.vbs chiamerà il tuo script con il metodo Windows Script Host Run () , che accetta:

  • intWindowStyle: 0 significa "finestre invisibili"
  • bWaitOnReturn: false significa che il tuo primo script non deve attendere il completamento del secondo script

Ecco invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

3
2k visualizzazioni e che bel post + risposta, più persone dovrebbero votare questo thread
Ric Tokyo

Ottima soluzione, esattamente quello di cui avevo bisogno.
nikhil

L'unico problema è che questo crea un processo denominato "cmd.exe", difficile da trovare in futuro.
Aditya Gupta

12

Converti il ​​file batch in un exe. Prova Bat To Exe Converter o Online Bat To Exe Converter e scegli l'opzione per eseguirlo come un'applicazione fantasma, cioè senza finestra.


3
Possibile, ma cercherò di evitare qualsiasi passaggio aggiuntivo in questo caso.
VonC

21
Di solito non sono così paranoico, ma non sarebbe molto stupido lasciare che qualcuno anonimo generi quell'exe per me? Tutti i tipi di cose dannose potrebbero essere iniettate.
Tobias

9

Penso che questa sia la soluzione più semplice e breve per eseguire un file batch senza aprire la finestra DOS, può essere molto fastidioso quando si desidera programmare un insieme di comandi da eseguire periodicamente, quindi la finestra DOS continua a comparire, ecco la soluzione . Usa uno script VBS per chiamare il file batch ...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

Copia le righe sopra in un editor e salva il file con estensione .VBS. Modificare il nome del file .BAT e il percorso di conseguenza.


1
Approccio interessante, sicuramente più breve della mia soluzione. +1
VonC

Ottima soluzione. Leggendo questo ho notato che non c'è davvero bisogno di usare Set WshShell = Nothing, ha funzionato bene per me e puoi avere un modo ancora più piccolo per farlo.
Patrick Bard

7

Ecco la mia raccolta di modi per ottenere ciò - e anche di più - dove è stato possibile ho provato a restituire anche il PID del processo avviato (tutti gli script collegati possono essere scaricati e salvati con qualsiasi nome tu trovi conveniente):

1) La soluzione IEXPRESS può essere utilizzata anche su vecchie macchine win 95/98. Iexpress è uno strumento molto antico che è ancora impacchettato con Windows, poiché gli argomenti accetta solo il comando ei suoi argomenti.

Utilizzo di esempio:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS - Accetta di nuovo solo due argomenti: il comando e gli argomenti, controlla anche se è stato avviato con autorizzazioni elevate e, se possibile, ottiene il PID del processo con WEVTUTIL (disponibile da Vista e versioni successive, quindi la versione più recente di Windows riceverà il PID).

Utilizzo di esempio:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell' : lo script è il wrapper completo di 'WScript.Shell' e ogni possibile opzione può essere impostata tramite le opzioni della riga di comando. È un ibrido jscript / batch e può essere chiamato come bat.

Esempio di utilizzo (per maggiori informazioni stampare la guida con '-h'):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' - ancora una volta il wrapper completo e tutte le opzioni sono accessibili tramite gli argomenti della riga di comando. Questa volta è ibrido WSF / batch con alcune parti di codice Jscript e VBScript - ma restituisce il PID del processo avviato. non nascoste alcune opzioni come le coordinate X / Y possono essere utilizzate (non applicabile a tutti gli eseguibili, ma ad esempio cmd.exe accetta le coordinate).

Esempio di utilizzo (per maggiori informazioni stampare la guida con '-h'):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5) Il. Soluzione NET . La maggior parte delle opzioni delle opzioni ProcessStartInfo vengono utilizzate (ma alla fine ero troppo stanco per includere tutto):

Esempio di utilizzo (per maggiori informazioni stampare la guida con '-h'):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

2

Nell'altra domanda ho suggerito autoexnt . Ciò è possibile anche in questa situazione. Basta impostare il servizio in modo che venga eseguito manualmente (cioè non automatico all'avvio). Quando si desidera eseguire il batch, modificare il file autoexnt.bat per chiamare il file batch desiderato e avviare il servizio autoexnt.

Il file batch per avviarlo, può essere simile a questo (non testato):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

Tieni presente che i file batch avviati in questo modo vengono eseguiti come utente di sistema, il che significa che non hai accesso alle condivisioni di rete automaticamente. Ma puoi usare net use per connetterti a un server remoto.

È necessario scaricare il Resource Kit di Windows 2003 per ottenerlo. Il Resource Kit può essere installato anche su altre versioni di Windows, come Windows XP.


1
Interessante, ma decisamente eccessivo per questo scenario.
VonC

2

Eseguilo con un nome utente diverso, utilizzando "runas" o pianificandolo con un utente diverso in Attività pianificate di Windows.


Possibile, ma non esattamente quello che sto
cercando

0

Puoi eseguire il tuo file .bat tramite un file .vbs
Copia il codice seguente nel tuo file .vbs:

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 

0

Puoi anche usare

start /MIN notepad.exe

PS: sfortunatamente, lo stato della finestra ridotta a icona dipende dal comando da eseguire. VG non funziona

start /MIN calc.exe
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.