Frage Führen Sie eine BAT-Datei in einer geplanten Aufgabe ohne ein Fenster aus


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

Es gelang mir, das Fenster minimiert erscheinen zu lassen, indem ich den geplanten Job ausführen ließ

cmd /c start /min mybat.bat

aber das gibt mir jede Stunde ein neues Befehlsfenster. Das hat mich überrascht cmd /c "Führt den mit string angegebenen Befehl aus und beendet dann" - Ich muss die Dokumente falsch verstanden haben.

Gibt es eine Möglichkeit, ein Batch-Skript auszuführen, ohne dass ein cmd-Fenster geöffnet wird?


139
2018-05-17 09:00


Ursprung


Ich fand diese eine bessere Antwort stackoverflow.com/questions/6568736/... - Efekt


Antworten:


Sie können es stattdessen im Hintergrund mit einer Windows-Skriptdatei ausführen. Mit der Ausführungsmethode können Sie ein Skript im unsichtbaren Modus ausführen. Ein ... kreieren .vbs Datei 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 plane es. Das zweite Argument in diesem Beispiel legt den Fensterstil fest. 0 bedeutet "Fenster ausblenden".

Vollständige Syntax des Methode ausführen:

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

Argumente:

  • Objekt: WshShell-Objekt.
  • strCommand: String-Wert, der die Befehlszeile angibt, die Sie ausführen möchten. Sie müssen alle Parameter einschließen, die Sie an die ausführbare Datei übergeben möchten.
  • intWindowStyle: Optional. Integer-Wert, der das Aussehen des Programmfensters angibt. Beachten Sie, dass nicht alle Programme diese Informationen verwenden.
  • bWaitOnReturn: Optional. Boolescher Wert, der angibt, ob das Skript auf die Ausführung des Programms warten soll, bevor es mit der nächsten Anweisung in Ihrem Skript fortfährt. Wenn diese Eigenschaft auf "true" gesetzt ist, wird die Skriptausführung angehalten, bis das Programm beendet wird, und "Run" gibt den vom Programm zurückgegebenen Fehlercode zurück. Wenn sie auf "false" (den Standardwert) gesetzt ist, kehrt die Run-Methode unmittelbar nach dem Start des Programms zurück und gibt automatisch 0 zurück (wird nicht als Fehlercode interpretiert).

142
2018-05-17 09:08



+1, hat genau das gleiche geschrieben - Sam Cogan
Ich habe es gesehen, bevor du es gelöscht hast. Ich schätze, wir sind beide Bots. ;-) - splattne
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 Blasphemie! ;-) - splattne
Auf die Frage "Gibt es eine Möglichkeit, ein Batch-Skript auszuführen, ohne dass ein cmd-Fenster geöffnet wird?" Gibt es eine sehr direkte Antwort: Führen Sie es mit einer Windows-Skriptdatei aus. - Mark Meuer
@Lee Ich denke, doppelte Anführungszeichen sind notwendig, wenn Ihr Pfad Leerzeichen enthält. - splattne


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, die Windows-Authentifizierung benötigen (wie Dateifreigaben oder Drucker), können Sie es als "nt authority \ system" ausführen und das Kennwort leer lassen. Stellen Sie unter Windows 7 einfach den Benutzer auf SYSTEM und drücken Sie OK.

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

JR


55
2018-05-17 09:13



Danke - das war weniger mühsam für mich als die Option .vbs. - mackenir
Ich habe den "Run as" -Benutzer auf SYSTEM gestellt (was er später geändert hat o NT AUTHORITY \ SYSTEM) und es funktionierte für mich. Ich sehe das Popup-CMD-Fenster nicht mehr, wenn meine geplante Aufgabe ausgeführt wird. Vielen Dank! - Ryan Stille
+1, das ist elegant. Stellen Sie sicher, dass Sie "system" als Benutzername eingeben, dann erledigt win7 den Rest für Sie. Beachten Sie, dass Sie Netzwerkzugriff auf das Internet erhalten, nur nicht Netzwerkfreigaben und Dinge, die Windows-Authentifizierung benötigen. - samsmith
Systembenutzer ist einfach und elegant, groß TIPP! +1! - Matteo Conta
Sehen Implementieren von Verwaltungsmodellen mit der geringsten Berechtigung. Ist die Verwendung des System-Accounts ein Verstoß gegen Least-Privilege-Richtlinien? Wenn ja, sollten Administratoren dies wissen nicht Mach das in den meisten Situationen. - user34660


Konfigurieren Sie den geplanten Task einfach als "Ausführen, ob der Benutzer angemeldet ist oder nicht".


27
2017-10-04 20:06



Perfekt! Sie können sogar den Speicher für Anmeldeinformationen deaktivieren, und das ist dann sicherer als die Ausführung von SYSTEM! - binki


Du könntest es auch versuchen KWK (versteckten Prozess erstellen), macht genau das, was du denkst ...

CHP.EXE mybat.bat

Wird ohne Befehlsfenster ausgeführt. Perfekt! Hergestellt von den gleichen Leuten wie CMDOW, aber das ist passender.


17
2017-07-20 21:54



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
Dies ist kein eingebautes Werkzeug - Jonny Leeds


CMDOW ist ein großartiges Tool, mit dem Sie viele, viele Dinge an Windows von der Kommandozeile aus tun können.

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

cmdow @ /hid

oder starte einen neuen versteckten Prozess mit

cmdow /run /hid mybat.bat 

9
2018-05-17 11:30



Sowohl dieser als auch Rocketmonkeys Vorschlag beinhaltet das Herunterladen neuer Tools, was mehr Kompatibilität mit den Desktops verschiedener Benutzer bedeutet. Das Eingebackene mit Windows-Befehlen ist viel besser. - IanVaughan
Plus cmdow wird von einigen Antivirenprogrammen als "gefährlich" erkannt (ist es nicht gefährlich, aber die Erkennung kann selbst zu Problemen führen, wenn die cmdow-Datei unter Quarantäne gestellt wird ...). - Otiel
Es gibt immer noch Popup-Konsole, nur blitzen sehr schnell. - Bamboo


Versuchen Sie das Skript mit aufzurufen

start /b <command>

5
2018-05-17 14:54



Dies funktioniert nicht, die geplante Task-> Status-States "konnte nicht gestartet werden", das heißt mit: start / b C: \ file.bat: und: start / b "C: \ file.bat": aber: C: \ file.bat: funktioniert gut. - IanVaughan
weil start ist kein Programm, es ist ein Befehl. Sie müssen angeben cmd als das Programm zu laufen und /c start /b <file> als Argument. Dies wird jedoch immer noch nicht funktionieren, da es immer noch ein Konsolenfenster für erstellen wird cmd und blitze ein schwarzes Fenster auf dem Bildschirm. - Synetech
Sie können auch mit @Synetech bestätigen, dass dadurch kein neues Fenster erstellt wird. Sie müssen jedoch noch ein Konsolenfenster geöffnet haben, um es zu starten. Dies ist in der Tat ein praktischer Befehl, kann aber nicht so verwendet werden, wie dies bei geplanten Aufgaben der Fall ist. - JonathanDavidArndt


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

Wichtig: Sie müssen den Pfad zu der Verknüpfung manuell angeben, indem Sie ihn in das Textfeld Ausführen eingeben, einschließlich der Erweiterung .lnk. Wenn Sie nur versuchen, es zu durchsuchen, wird es hilfreich Redirect sich auf was auch immer die Verknüpfung verweist.


5
2017-08-11 16:49



Dies funktioniert nicht auf Windows 10 x64, dies gibt ein Popup "Wie möchten Sie diese Datei öffnen?" - Jan


Mir ist klar, dass diese Frage bereits mit einer perfekten, nativen Windows-Lösung beantwortet wurde und daher die kompatibelste sein sollte, und ich stimme ihr vollkommen zu.

Ich wollte auch sagen, dass ich @ Splattnes Kommentar nicht zustimme (aber nicht seine tatsächliche Antwort) - dass die Auflösung in dem anderen referenzierten Thread den Kredit verdient. Diese Antwort beinhaltet, dass das Skript als ein anderer Benutzer (SYSTEM) ausgeführt wird, was ziemlich genau dem Root-Zugriff des Skripts entspricht. Es wird auch für Jobs wie ROBOCOPY (wie von John Rennie verwiesen), die Netzwerkzugriff erfordern.

Ich habe es noch nie versucht CMDOW vor, aber ich möchte eine andere ähnliche Auflösung anbieten, die [obwohl nicht nativ unter Windows installiert] für die meisten Versionen immer noch sehr portabel ist und sowohl in 32- als auch in 64-Bit-Versionen erhältlich ist, und das ist NirCmd.

NirCmd ist ein sehr mächtiges Werkzeug, das unzählige Optionen hat, von denen die nützlichste, die ich persönlich finde, seine Fähigkeit ist, versteckte Befehlsfenster zu starten, indem einfach folgendes ausgeführt wird:

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

Von dem exec Abschnitt von Die 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. Die Show/verbergen/ min / max] Parameter Gibt an, ob die laufende Anwendung sichtbar sein soll oder nicht. Wenn 'Verbergen' angegeben ist, ist die laufende Anwendung für den Benutzer nicht sichtbar. Wenn 'max' angegeben ist, wird das ausgeführte Anwendungsfenster maximiert. Wenn 'min' angegeben ist, wird das ausgeführte Anwendungsfenster minimiert.

BEARBEITEN: Ich habe versucht, einen zu rennen ROBOCOPY Job und versuchte die Methode in dieser Antwort, und es hat nicht funktioniert, auch nach dem Bearbeiten der Netzwerkzugriffsprivilegien. Ich habe versucht, auf das Skript doppelzuklicken und konnte es nicht zum Laufen bringen, konnte es aber nur unter einer erhöhten Eingabeaufforderung ausführen. Ich habe eine Verknüpfung zur Batch-Datei erstellt und habe sie als Administrator laufen lassen und konnte sie ausführen, indem ich darauf doppelklickte, aber die Methode, mit der ich endete, war, sie als SYSTEM versteckt zu betreiben (ich weiß, ich weiß) - Aber es funktioniert mit ROBOCOPY, für was es sich lohnt, solange die Batch-Datei die richtigen Berechtigungen hat.

EDIT 2: Aus irgendeinem Grund würde es nicht als SYSTEM funktionieren (wahrscheinlich die Netzwerkzugriffssache, auf die zuvor verwiesen wurde) - das habe ich erst nach dem tatsächlichen Ausführen bemerkt ROBOCOPY ohne das / L-Flag, das ist im Grunde nur eine Simulation und [scheinbar] nicht wirklich mit dem Remote-System verbinden, aber wenn ich die Batch-Datei mit den höchsten Berechtigungen ausführen und die versteckte Box zu überprüfen, und ich kann es immer noch als ausführen angemeldeter Benutzer im Hintergrund, ohne dass ein Befehlsfenster angezeigt wird, was auch immer dies für irgendjemanden wert ist.


1
2018-05-01 03:38





Eine andere Lösung, die ich verwendet habe, ist Versteckter Start


0
2017-07-01 07:38