Windows XP o versioni successive Windows: come posso eseguire un file batch in background senza windows visualizzate?

So di aver già risposto a una domanda simile ( eseguendo il file batch in background all’avvio di Windows ), ma questa volta ho bisogno di 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 (lanciato dal primo in modo asincrono ) mostri anche una finestra della console.

Ho creato uno script VBScript che fa proprio questo, e ho messo lo script come una risposta per gli altri a cui fare riferimento , ma se avete altre idee / soluzioni, sentitevi liberi di contribuire.

Nota: la finestra della console del processore dei comandi di Windows non viene definita finestra DOS corretta da molte persone.


Grazie a tutti per le risposte. Da quanto ho capito, se ho bisogno di chiamare in modo asincrono uno script per l’esecuzione in una modalità invisibile:

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

    Avete bisogno che il secondo file batch venga eseguito in modo asincrono? In genere un file batch esegue un altro in modo sincrono con il comando di call e il secondo condivide la prima finestra.

    È ansible 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 simultaneamente sulla console, l’output sarà sovrapposto e probabilmente indecifrabile. Inoltre, ti consigliamo di inserire un comando di exit alla fine del tuo secondo file batch, altrimenti entro una seconda shell cmd una volta terminato tutto.

    Ecco una ansible 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 richiede:

    • intWindowStyle: 0 significa “windows invisibili”
    • bWaitOnReturn: false significa che il tuo primo script non ha bisogno di attendere il completamento del tuo 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 " 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 

    Convertire il file batch in un exe. Prova il convertitore Bat To Exe o il convertitore online di Bat To Exe , e scegli l’opzione per eseguirlo come un’applicazione fantasma, ovvero nessuna finestra.

    Ecco la mia raccolta di modi per raggiungere questo objective – e anche di più – dove è stato ansible che ho provato a restituire anche il PID del processo avviato (tutti gli script collegati possono essere scaricati e salvati con qualsiasi nome trovi conveniente):

    1) La soluzione IEXPRESS può essere utilizzata anche su vecchie macchine Win 95/98. Iexpress è uno strumento davvero antico che è ancora in pacchetto con Windows, poiché gli argomenti accettano solo il comando e i suoi argomenti.

    Esempio di utilizzo:

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

    2) SCHTASK – Ancora accetta solo due argomenti – il comando e gli argomenti. Controlla anche se è iniziato con autorizzazioni elevate e se ansible ottiene il PID del processo con WEVTUTIL (disponibile da Vista e sopra così la versione più recente di Windows riceverà il Comando PID).

    Esempio di utilizzo:

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

    3) ‘WScript.Shell’ – lo script è completamente wrapper di ‘WScript.Shell’ e ogni opzione ansible può essere impostata tramite le opzioni della riga di comando. È un ibrido jscript / batch e può essere chiamato come un pipistrello.

    Esempio di utilizzo (per maggiori informazioni stampa la guida con ‘-h’):

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

    4) “Win32_ProcessStartup” – di nuovo full wrapper e tutte le opzioni sono accessibili tramite gli argomenti della riga di comando. Questa volta è WSF / batch ibrido con alcuni Jscript e alcuni pezzi di codice VBScript – ma restituisce il PID del processo avviato. Se il processo è non nascosto alcune opzioni come le coordinate X / Y possono essere usate (non applicabile per ogni eseguibile – ma ad esempio cmd.exe accetta coordinate).

    Esempio di utilizzo (per maggiori informazioni stampa 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 di opzioni ProcessStartInfo sono utilizzate (ma alla fine ero troppo stanco per includere tutto):

    Esempio di utilizzo (per maggiori informazioni stampa la guida con ‘-h’):

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

    Penso che questa sia la soluzione più semplice e più veloce 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 spuntare, ecco la soluzione . Utilizzare 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 a un editor e salva il file con estensione .VBS. Modificare di conseguenza il nome e il percorso del file .BAT.

    Nell’altra domanda ho suggerito autoexnt . Questo è anche ansible in questa situazione. Basta impostare il servizio per eseguire 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 iniziare questo, può apparire come questo (non testato):

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

    Si noti che i file batch avviati in questo modo vengono eseguiti come utente di sistema, il che significa che non si ha accesso automatico alle condivisioni di rete. Ma puoi usare net use per connetterti a un server remoto.

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

    Eseguirlo con un nome utente diverso, utilizzando “runas” o pianificandolo con un altro utente in Attività pianificate di Windows.

    Puoi eseguire il tuo file .bat attraverso un file .vbs
    Copia il seguente codice 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