Esegui un file .bat in un'attività pianificata senza una finestra


143

Ho un'attività pianificata che avvia uno script batch che viene eseguito robocopyogni ora. Ogni volta che viene eseguita una finestra si apre sul desktop con l'output di robotica, che non voglio davvero vedere.

Sono riuscito a far apparire la finestra minimizzata facendo eseguire il lavoro pianificato

cmd /c start /min mybat.bat

ma questo mi dà una nuova finestra di comando ogni ora. Sono stato sorpreso da questo, dato che cmd /c"Esegue il comando specificato dalla stringa e quindi termina" - Devo aver frainteso i documenti.

C'è un modo per eseguire uno script batch senza far apparire una finestra cmd?


Ho trovato questa una risposta più preferibile stackoverflow.com/questions/6568736/…
Efekt

Risposte:


144

È possibile eseguirlo in silenzio utilizzando invece un file di script di Windows. Il metodo Run consente di eseguire uno script in modalità invisibile. Crea un .vbsfile come questo

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

e programmarlo. Il secondo argomento in questo esempio imposta lo stile della finestra. 0 significa "nascondi la finestra".

Sintassi completa del metodo Run :

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

Argomenti:

  • oggetto: oggetto WshShell.
  • strCommand: valore stringa che indica la riga di comando che si desidera eseguire. È necessario includere tutti i parametri che si desidera passare al file eseguibile.
  • intWindowStyle: facoltativo. Valore intero che indica l'aspetto della finestra del programma. Si noti che non tutti i programmi utilizzano queste informazioni.
  • bWaitOnReturn: facoltativo. Valore booleano che indica se lo script deve attendere il completamento dell'esecuzione del programma prima di continuare con l'istruzione successiva nello script. Se impostato su true, l'esecuzione dello script si interrompe fino al termine del programma ed Esegui restituisce qualsiasi codice di errore restituito dal programma. Se impostato su false (impostazione predefinita), il metodo Run ritorna immediatamente dopo l'avvio del programma, restituendo automaticamente 0 (da non interpretare come un codice di errore).

+1, ha scritto esattamente la stessa cosa
Sam Cogan,

L'ho visto prima che tu lo cancellassi. Immagino che siamo entrambi dei robot. ;-)
splattne,

1
nome utente, onestamente penso che Sam lo meriti molto più di me. Ma grazie comunque! E non menzionare me e Jon Skeet nella stessa frase. Questa è una bestemmia! ;-)
splattne,

3
Alla domanda "Esiste un modo per eseguire uno script batch senza far apparire una finestra cmd?", Fornisce una risposta molto diretta: eseguirlo utilizzando un file di script di Windows.
Mark Meuer,

2
@ Credo che le virgolette doppie siano necessarie se il tuo percorso contiene spazi.
splattne

58

Lo stai eseguendo come attività pianificata? In tal caso, impostalo per essere eseguito come un account utente diverso, quindi non sarà visibile all'utente connesso. Se lo script non ha bisogno dell'accesso di rete agli elementi che richiedono l'autenticazione di Windows (come condivisioni di file o stampanti), è possibile eseguirlo come "nt autorità \ sistema" e lasciare vuota la password. Su Windows 7, imposta l'utente su SYSTEM e premi OK.

(Probabilmente devi usare un vero utente se stai usando robocopy ...)

JR


3
Grazie - questa è stata una seccatura per me rispetto all'opzione .vbs.
mackenir,

8
Ho impostato l'utente "Esegui come" su SYSTEM (che in seguito ha cambiato NT AUTHORITY \ SYSTEM) e ha funzionato per me. Non vedo più la finestra popup CMD quando viene eseguita l'attività pianificata. Grazie!
Ryan Stille,

1
+1, questo è elegante. Assicurati di inserire "system" come nome utente, quindi win7 fa il resto per te. Nota che ottieni l'accesso alla rete a Internet, non solo alle condivisioni di rete e cose che richiedono l'autenticazione di Windows.
samsmith

1
L'utente del sistema è semplice ed elegante, ottimo SUGGERIMENTO! +1!
Matteo Conta,

1
Vedere Implementazione di modelli amministrativi con privilegi minimi . L'uso dell'account di sistema per questo è una violazione delle politiche del privilegio minimo? In tal caso, gli amministratori dovrebbero sapere di non farlo nella maggior parte delle situazioni.
user34660

29

È sufficiente configurare l'attività pianificata come "Esegui se l'utente è connesso o meno".


6
Perfetto! È anche possibile disabilitare l'archiviazione delle credenziali e quindi questo risulta essere più sicuro rispetto all'avvio di SYSTEM!
binki,

17

Potresti anche provare CHP (Crea processo nascosto) , fa esattamente quello che pensi ...

CHP.EXE mybat.bat

Funziona senza finestra di comando. Perfetto! Realizzato dalle stesse persone di CMDOW, ma questo è più appropriato.


Funziona perfettamente quando è necessario eseguire l'attività nel contesto dell'utente che ha effettuato l'accesso ("Trigger: durante la connessione alla sessione utente", "Esegui attività come: Utenti")
Sergei

1
questo non è uno strumento
integrato

9

CMDOW è uno strumento formidabile che ti permette di fare molte, molte cose su Windows dalla riga di comando.

Una delle cose più semplici da fare è nascondere la finestra corrente (di solito come prima riga nel file bat) con:

cmdow @ /hid

o avviare un nuovo processo nascosto con

cmdow /run /hid mybat.bat 

4
Sia questo che il suggerimento di Rocketmonkeys prevedono il download di nuovi strumenti, il che significa una maggiore compatibilità sui desktop di vari popoli. La cottura, usando i comandi di Windows è molto meglio.
IanVaughan,

Inoltre cmdow viene rilevato come "pericolosi" da alcuni programmi anti-virus (è non è pericolosa, ma la rilevazione stessa può causare alcuni problemi se il file viene messo in quarantena cmdow ...).
Otiel,

3
c'è ancora una console popup, basta un flash molto veloce.
Bamboo,

5

Prova a invocare lo script con

start /b <command>

1
Questo non funziona, l'attività pianificata-> Stato indica "Impossibile avviare", questo è: start / b C: \ file.bat: and: start / b "C: \ file.bat": but: C: \ file.bat: funziona bene.
IanVaughan,

1
Perché startnon è un programma, è un comando. È necessario specificare cmdcome programma da eseguire e /c start /b <file>come argomento. Tuttavia, questo non funzionerà ancora perché creerà comunque una finestra della console cmde farà lampeggiare una finestra nera sullo schermo.
Synetech,

1
Con @Synetech puoi anche confermare che ciò non creerà una nuova finestra, ma per poterla avviare devi comunque aprire una finestra della console. Questo è davvero un comando utile, ma non può essere utilizzato come richiesto con le Attività pianificate.
JonathanDavidArndt,

5

È possibile creare un collegamento al file batch, impostare il collegamento per l'avvio ridotto (nelle proprietà del collegamento, scheda "Collegamento"), quindi impostare il lavoro per avviare il collegamento.

Importante : dovrai specificare manualmente il percorso del collegamento digitandolo nel campo di testo Esegui, completo dell'estensione '.lnk'; se provi semplicemente a cercarlo, ti reindirizzerà in modo utile a qualunque punto scorciatoia.


Questo non funziona su Windows 10 x64, questo dà un popup "Come si desidera aprire questo file?"
gennaio

1

Mi rendo conto che a questa domanda sia già stata data una risposta con una risoluzione perfettamente nativa di Windows e quindi dovrebbe essere la più compatibile, e sono completamente d'accordo.

Volevo anche dire che non sono d'accordo con il commento di @ splattne (ma non con la sua risposta effettiva) - che la risoluzione nell'altro thread di riferimento merita il merito. Questa risposta implica l'esecuzione dello script come un altro utente (SYSTEM), che è praticamente l'equivalente di dare accesso allo script root. Fallirà anche per lavori come ROBOCOPY(come indicato da John Rennie), che richiedono l'accesso alla rete.

Non ho mai provato CMDOWprima, ma vorrei offrire un'altra risoluzione simile, che [sebbene non sia installata in modo nativo su Windows] è ancora altamente portatile per la maggior parte delle versioni, ed è disponibile in entrambe le versioni a 32 e 64 bit, e cioè NirCmd .

NirCmd è uno strumento molto potente che ha una miriade di opzioni, la più utile delle quali trovo personalmente la capacità di avviare finestre di comandi nascoste semplicemente eseguendo quanto segue:

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

Dalla execsezione della Guida ai comandi di NirCmd :

exec [show/hide/min/max] [application + command-line]

Esegue un'applicazione e, facoltativamente, specifica uno o più parametri della riga di comando per l'applicazione eseguita. Il parametro [show / hide / min / max] consente di specificare se l'applicazione in esecuzione sarà visibile o meno. Se si specifica 'nascondi', l'applicazione in esecuzione non sarà visibile all'utente. Se si specifica 'max', la finestra dell'applicazione in esecuzione verrà ingrandita. Se si specifica 'min', la finestra dell'applicazione in esecuzione verrà ridotta a icona.

EDIT: stavo cercando di eseguire un ROBOCOPYlavoro e ho provato il metodo in questa risposta, e non ha funzionato, anche dopo aver modificato i privilegi di accesso alla rete. Ho provato a fare doppio clic sullo script e non sono riuscito a farlo funzionare, ma ho potuto farlo funzionare solo con un prompt dei comandi elevato. Ho creato un collegamento al file batch e l'ho eseguito come amministratore e sono stato in grado di farlo eseguire facendo doppio clic su di esso, ma il metodo che ho finito è stato quello di eseguirlo nascosto come SISTEMA (lo so, lo so) - ma funziona ROBOCOPY, per quello che vale, purché il file batch disponga delle autorizzazioni corrette.

EDIT 2: Per qualche motivo, non funzionerebbe come SYSTEM (probabilmente la cosa di accesso alla rete a cui si fa riferimento in precedenza) - L'ho notato solo dopo aver effettivamente eseguito ROBOCOPYsenza il flag / L, che è fondamentalmente solo una simulazione e [apparentemente] non funziona effettivamente connettersi al sistema remoto, ma quando eseguo il file batch con i privilegi più alti e seleziono la casella nascosta, e posso ancora eseguirlo come l'utente che ha effettuato l'accesso in background senza che sia visualizzata una finestra di comando, per tutto ciò che vale per chiunque .



-2

Prova a inserire un comando di uscita alla fine del file batch. Questo dovrebbe chiudere la finestra di comando al termine dello script.


-2

Per nascondere l'output (sebbene non la finestra), aggiungilo all'inizio del file batch:

@echo off
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.