Führen Sie eine BAT-Datei in einer geplanten Task ohne Fenster aus

143

Ich habe eine geplante Aufgabe, die ein Stapelskript startet, das robocopyjede Stunde ausgeführt wird. Jedes Mal, wenn es ausgeführt wird, erscheint auf dem Desktop ein Fenster mit der Ausgabe von robocopy, die ich eigentlich nicht sehen möchte.

Ich konnte das Fenster minimieren, indem ich den geplanten Job ausführen ließ

cmd /c start /min mybat.bat

das gibt mir aber jede stunde ein neues befehlsfenster. Ich war überrascht darüber, dass cmd /c"den durch string angegebenen Befehl ausführt und dann beendet" - ich muss die Dokumente falsch verstanden haben.

Gibt es eine Möglichkeit, ein Batch-Skript auszuführen, ohne ein Cmd-Fenster aufzurufen?

Tom Dunham
quelle
Ich fand dieses eine vorzuziehende Antwort stackoverflow.com/questions/6568736/…
Efekt

Antworten:

144

Sie können es stattdessen im Hintergrund mithilfe einer Windows-Skriptdatei ausführen. Mit der Run-Methode können Sie ein Skript im unsichtbaren Modus ausführen. Erstellen Sie eine .vbsDatei wie diese

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

und planen Sie es. Das zweite Argument in diesem Beispiel legt den Fensterstil fest. 0 bedeutet "Fenster verstecken".

Vollständige Syntax der Run-Methode :

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

Argumente:

  • object: WshShell-Objekt.
  • strCommand: String-Wert, der die Befehlszeile angibt, die Sie ausführen möchten. Sie müssen alle Parameter angeben, die Sie an die ausführbare Datei übergeben möchten.
  • intWindowStyle: Optional. Ganzzahliger Wert, der das Erscheinungsbild des Programmfensters angibt. Beachten Sie, dass nicht alle Programme diese Informationen verwenden.
  • bWaitOnReturn: Optional. Boolescher Wert, der angibt, ob das Skript warten soll, bis die Ausführung des Programms abgeschlossen ist, bevor mit der nächsten Anweisung in Ihrem Skript fortgefahren wird. Wenn true festgelegt ist, wird die Skriptausführung angehalten, bis das Programm beendet ist, und Run gibt den vom Programm zurückgegebenen Fehlercode zurück. Bei false (Standardeinstellung) wird die Run-Methode sofort nach dem Starten des Programms zurückgegeben, wobei automatisch 0 zurückgegeben wird (nicht als Fehlercode zu interpretieren).
splattne
quelle
+1, schrieb gerade genau das gleiche
Sam Cogan
Ich habe es gesehen, bevor du es gelöscht hast. Ich denke wir sind beide Bots. ;-)
Splattne
1
Benutzername, ich denke ehrlich, dass Sam es viel mehr verdient als ich. Aber danke trotzdem! Und erwähne mich und Jon Skeet nicht im selben Satz. Das ist Gotteslästerung! ;-)
Splattne
3
Auf die Frage "Gibt es eine Möglichkeit, ein Batch-Skript auszuführen, ohne ein Cmd-Fenster zu öffnen?" Gibt es eine sehr direkte Antwort: Führen Sie es mit einer Windows-Skriptdatei aus.
Mark Meuer
2
@Lee Ich denke, doppelte Anführungszeichen sind notwendig, wenn Ihr Pfad Leerzeichen enthält.
Splattne
58

Führen Sie dies als geplante Aufgabe aus? Wenn dies so eingestellt ist, dass es als ein anderes Benutzerkonto ausgeführt wird, ist es für den angemeldeten Benutzer nicht sichtbar. Wenn das Skript keinen Netzwerkzugriff auf Elemente benötigt, für die Windows-Authentifizierung erforderlich ist (z. B. Dateifreigaben oder Drucker), können Sie es als "nt authority \ system" ausführen und das Kennwort leer lassen. Setzen Sie unter Windows 7 den Benutzer einfach auf SYSTEM und drücken Sie OK.

(Sie müssen jedoch wahrscheinlich einen echten Benutzer verwenden, wenn Sie Robocopy verwenden ...)

JR

John Rennie
quelle
3
Danke - das war für mich weniger problematisch als die Option .vbs.
Mackenir
8
Ich habe den Benutzer "Ausführen als" auf SYSTEM gesetzt (was später in NT AUTHORITY \ SYSTEM geändert wurde) und es hat bei mir funktioniert. Ich sehe das Popup-CMD-Fenster nicht mehr, wenn meine geplante Aufgabe ausgeführt wird. Vielen Dank!
Ryan Stille
1
+1, das ist elegant. Vergewissern Sie sich, dass Sie als Benutzername "system" eingeben, und win7 erledigt den Rest für Sie. Beachten Sie, dass Sie keinen Netzwerkzugriff auf das Internet haben, nur nicht auf Netzwerkfreigaben und Dinge, die Windows-Authentifizierung erfordern.
Samsmith
1
Systembenutzer ist einfach und elegant, großer TIPP! +1!
Matteo Conta
1
Siehe Implementieren von Verwaltungsmodellen mit den geringsten Berechtigungen . Handelt es sich bei der Verwendung des Systemkontos um eine Verletzung der Richtlinien mit den geringsten Berechtigungen? Wenn ja, sollten Administratoren wissen, dass dies in den meisten Situationen nicht der Fall ist.
user34660
29

Konfigurieren Sie die geplante Aufgabe einfach als "Ausführen, ob der Benutzer angemeldet ist oder nicht".

Peter Meinl
quelle
6
Perfekt! Sie können sogar die Speicherung von Anmeldeinformationen deaktivieren, was letztendlich sicherer ist, als wenn SYSTEM es ausführt!
Binki
17

Sie können auch CHP (Versteckten Prozess erstellen) ausprobieren und genau das tun, was Sie denken ...

CHP.EXE mybat.bat

Läuft ohne Befehlsfenster. Perfekt! Hergestellt von denselben Leuten wie CMDOW, aber dies ist angemessener.

Raketenaffen
quelle
Funktioniert perfekt, wenn Sie die Aufgabe im Kontext des angemeldeten Benutzers ausführen müssen ("Auslöser: Bei Verbindung mit Benutzersitzung", "Aufgabe ausführen als: Benutzer")
Sergei
1
Dies ist kein eingebautes Tool
JonnyRaa
9

CMDOW ist ein großartiges Tool, mit dem Sie von der Befehlszeile aus viele, viele Dinge an Fenstern ausführen können.

Eine der einfachsten Aufgaben ist das Ausblenden des aktuellen Fensters (normalerweise als erste Zeile in der bat-Datei) mit:

cmdow @ /hid

oder starten Sie einen neuen versteckten Prozess mit

cmdow /run /hid mybat.bat 
itsadok
quelle
4
Sowohl dies als auch der Vorschlag von Rocketmonkeys beinhalten das Herunterladen neuer Tools, was eine größere Kompatibilität zwischen verschiedenen Desktops bedeutet. Das Einbacken mit Windows-Befehlen ist viel besser.
IanVaughan
Außerdem wird cmdow von einigen Antivirenprogrammen als "gefährlich" erkannt (es ist nicht gefährlich, aber die Erkennung kann selbst Probleme verursachen, wenn die cmdow-Datei unter Quarantäne gestellt wird ...).
Otiel
3
Es gibt immer noch Popup-Konsole, nur blinken sehr schnell.
Bamboo
5

Versuchen Sie, das Skript mit aufzurufen

start /b <command>

quelle
1
Dies funktioniert nicht, der Status Geplanter Task-> Status lautet "Konnte nicht starten", das heißt: start / b C: \ file.bat: und: start / b "C: \ file.bat": aber: C: \ file.bat: funktioniert einwandfrei.
IanVaughan
1
Weil startes kein Programm ist, ist es ein Befehl. Sie müssen cmdals auszuführendes Programm und /c start /b <file>als Argument angeben . Dies wird jedoch immer noch nicht funktionieren, da weiterhin ein Konsolenfenster erstellt cmdund ein schwarzes Fenster auf dem Bildschirm angezeigt wird.
Synetech
1
Kann auch mit @Synetech bestätigen, dass dadurch kein neues Fenster erstellt wird, Sie müssen jedoch ein geöffnetes Konsolenfenster haben, um es zu starten. Dies ist in der Tat ein praktischer Befehl, kann jedoch bei geplanten Aufgaben nicht wie gewünscht verwendet werden.
JonathanDavidArndt
5

Sie können eine Verknüpfung zur Stapeldatei erstellen, die Verknüpfung so einstellen, dass sie minimiert gestartet wird (in den Eigenschaften der Verknüpfung, Registerkarte "Verknüpfung") und dann den Job zum Starten der Verknüpfung festlegen.

Wichtig : Sie müssen den Pfad zur Verknüpfung manuell angeben, indem Sie ihn in das Textfeld "Ausführen" mit der Erweiterung ".lnk" eingeben. Wenn Sie nur versuchen, dorthin zu navigieren, leitet sich das Programm automatisch zu dem weiter, auf das die Verknüpfung verweist.

Doug Kavendek
quelle
Dies funktioniert nicht unter Windows 10 x64, es erscheint ein Popup "Wie möchten Sie diese Datei öffnen?"
Jan
1

Mir ist klar, dass diese Frage bereits mit einer vollkommen guten Auflösung beantwortet wurde, die ursprünglich für Windows entwickelt wurde und daher die kompatibelste sein sollte, und ich stimme vollkommen zu.

Ich wollte auch sagen, dass ich mit @ splattnes Kommentar nicht einverstanden bin (aber nicht mit seiner tatsächlichen Antwort) - dass die Auflösung in dem anderen Thread, auf den verwiesen wird, die Anerkennung verdient. Diese Antwort beinhaltet das Ausführen des Skripts als ein anderer Benutzer (SYSTEM), was so ziemlich dem Gewähren des Skriptstammzugriffs entspricht. Es schlägt auch für Jobs wie ROBOCOPY(wie von John Rennie angegeben) fehl , die Netzwerkzugriff erfordern.

Ich habe es noch nie versucht CMDOW, aber ich möchte eine andere ähnliche Auflösung anbieten, die [obwohl sie unter Windows nicht nativ installiert ist] für die meisten Versionen hoch portierbar ist und sowohl in der 32- als auch in der 64-Bit-Version verfügbar ist NirCmd .

NirCmd ist ein sehr leistungsfähiges Tool mit unzähligen Optionen. Das nützlichste ist meiner Meinung nach die Möglichkeit, versteckte Befehlsfenster zu starten, indem Sie einfach Folgendes ausführen:

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

Aus dem execAbschnitt der NirCmd-Befehlsreferenz :

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

Führt eine Anwendung aus und gibt optional einen oder mehrere Befehlszeilenparameter für die ausgeführte Anwendung an. Der Parameter [show / hide / min / max] gibt an, ob die ausgeführte Anwendung angezeigt wird oder nicht. Wenn 'hide' angegeben wird, ist die ausgeführte Anwendung für den Benutzer nicht sichtbar. Wenn 'max' angegeben ist, wird das laufende Anwendungsfenster maximiert. Wenn 'min' angegeben wird, wird das laufende Anwendungsfenster minimiert.

BEARBEITEN: Ich habe versucht, einen ROBOCOPYJob auszuführen und habe die Methode in dieser Antwort ausprobiert, und sie hat auch nach dem Bearbeiten der Netzwerkzugriffsberechtigungen nicht funktioniert. Ich habe versucht, auf das Skript zu doppelklicken, und konnte es nicht zum Laufen bringen, sondern nur unter einer Eingabeaufforderung mit erhöhten Rechten ausführen. Ich habe eine Verknüpfung zur Batch-Datei erstellt und sie als Administrator ausführen lassen und konnte sie durch Doppelklicken ausführen, aber die Methode, die ich letztendlich gewählt habe, war, sie versteckt als SYSTEM auszuführen (ich weiß, ich weiß). - aber es funktioniert mit ROBOCOPY, was es wert ist, solange die Batch-Datei die richtigen Berechtigungen hat.

EDIT 2: Aus irgendeinem Grund würde es nicht als SYSTEM funktionieren (wahrscheinlich das zuvor erwähnte Netzwerkzugriffsobjekt) - ich habe dies erst bemerkt, nachdem ich ROBOCOPYdas / L-Flag tatsächlich ausgeführt habe , was im Grunde genommen nur eine Simulation ist und [anscheinend] nicht Stellen Sie eine Verbindung zum Remote-System her, aber wenn ich die Batch-Datei mit den höchsten Berechtigungen ausführe und das Kontrollkästchen "Versteckt" aktiviere, kann ich sie trotzdem als angemeldeter Benutzer im Hintergrund ausführen, ohne dass ein Befehlsfenster angezeigt wird .

rubynorails
quelle
-2

Versuchen Sie, am Ende Ihrer Batch-Datei einen Exit-Befehl einzugeben. Dies sollte das Befehlsfenster schließen, wenn das Skript fertig ist.

Brian S. Wilson
quelle
-2

Fügen Sie zum Ausblenden der Ausgabe (jedoch nicht des Fensters) Folgendes an den Anfang Ihrer Batchdatei ein:

@echo off
nichtig
quelle