web-dev-qa-db-fra.com

Exécuter un fichier .bat dans une tâche planifiée sans fenêtre

J'ai une tâche planifiée qui démarre un script de commandes qui exécute robocopy toutes les heures. Chaque fois qu'il s'exécute, une fenêtre apparaît sur le bureau avec la sortie de robocopy, que je ne veux pas vraiment voir.

J'ai réussi à faire apparaître la fenêtre minimisée en exécutant le travail planifié

cmd /c start /min mybat.bat

mais cela me donne une nouvelle fenêtre de commande toutes les heures. J'ai été surpris par cela, étant donné cmd /c "Exécute la commande spécifiée par chaîne puis se termine" - J'ai dû mal comprendre les documents.

Existe-t-il un moyen d'exécuter un script batch sans qu'il apparaisse une fenêtre cmd?

144
Tom Dunham

Vous pouvez l'exécuter en mode silencieux à l'aide d'un fichier de script Windows à la place. La méthode Run vous permet d'exécuter un script en mode invisible. Créer un .vbs fichier comme celui-ci

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

et le planifier. Le deuxième argument de cet exemple définit le style de fenêtre. 0 signifie "masquer la fenêtre".

Syntaxe complète de la méthode Run :

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

Arguments:

  • objet: objet WshShell.
  • strCommand: valeur de chaîne indiquant la ligne de commande que vous souhaitez exécuter. Vous devez inclure tous les paramètres que vous souhaitez transmettre au fichier exécutable.
  • intWindowStyle: facultatif. Valeur entière indiquant l'apparence de la fenêtre du programme. Notez que tous les programmes n'utilisent pas ces informations.
  • bWaitOnReturn: facultatif. Valeur booléenne indiquant si le script doit attendre la fin de l'exécution du programme avant de passer à l'instruction suivante de votre script. Si la valeur est true, l'exécution du script s'arrête jusqu'à la fin du programme et Run renvoie tout code d'erreur renvoyé par le programme. Si elle est définie sur false (valeur par défaut), la méthode Run renvoie immédiatement après le démarrage du programme, retournant automatiquement 0 (à ne pas interpréter comme un code d'erreur).
145
splattne

Exécutez-vous cela comme une tâche planifiée? Si tel est le cas, configurez-le pour qu'il s'exécute en tant que compte d'utilisateur différent, il ne sera pas visible pour l'utilisateur connecté. Si le script ne nécessite aucun accès réseau aux éléments nécessitant une authentification Windows (comme les partages de fichiers ou les imprimantes), vous pouvez l'exécuter en tant que "nt Authority\system" et laisser le mot de passe vide. Sous Windows 7, définissez simplement l'utilisateur sur SYSTEM et appuyez sur OK.

(Vous devez probablement utiliser un vrai utilisateur si vous utilisez robocopy ...)

JR

59
John Rennie

Configurez simplement la tâche planifiée comme "Exécuter, que l'utilisateur soit connecté ou non".

29
Peter Meinl

Vous pouvez également essayer CHP (Créer un processus caché) , fait exactement ce que vous pensez ...

CHP.EXE mybat.bat

Fonctionne sans fenêtre de commande. Parfait! Fabriqué par les mêmes personnes que CMDOW, mais c'est plus approprié.

18
rocketmonkeys

CMDOW est un outil génial qui vous permet de faire beaucoup, beaucoup de choses sur Windows à partir de la ligne de commande.

L'une des choses les plus simples à faire est de masquer la fenêtre actuelle (généralement comme première ligne dans le fichier bat) avec:

cmdow @ /hid

ou lancez un nouveau processus caché avec

cmdow /run /hid mybat.bat 
9
itsadok

Essayez d'appeler le script avec

start /b <command>
5
rashfeather

Vous pouvez créer un raccourci vers le fichier de commandes, définir le raccourci pour démarrer minimisé (dans les propriétés du raccourci, onglet "Raccourci"), puis définir le travail pour démarrer le raccourci.

Important: Vous devrez spécifier manuellement le chemin d'accès au raccourci en le tapant dans le champ de texte Exécuter, avec l'extension '.lnk'; si vous essayez simplement de le parcourir, il se redirigera utilement vers ce que le raccourci pointe.

5
Doug Kavendek

Je me rends compte que cette question a déjà été répondue avec une résolution parfaitement bonne qui est native de Windows et devrait donc être la plus compatible, et je suis entièrement d'accord.

Je voulais également dire que je suis en désaccord avec le commentaire de @ splattne (mais pas sa réponse réelle) - que la résolution dans l'autre thread référencé mérite le crédit. Cette réponse implique d'exécuter le script en tant qu'utilisateur différent (SYSTEM), ce qui équivaut à peu près à donner l'accès root au script. Il échouera également pour les travaux tels que ROBOCOPY (référencé par John Rennie), qui nécessitent un accès réseau.

Je n'ai jamais essayé CMDOW auparavant, mais je voudrais proposer une autre résolution similaire, qui [bien qu'elle ne soit pas installée en mode natif sur Windows] est toujours très portable pour la plupart des versions et existe en 32 et 64- versions de bits, et c'est NirCmd .

NirCmd est un outil très puissant qui a une myriade d'options, dont la plus utile, je trouve personnellement sa capacité à lancer des fenêtres de commandes cachées en exécutant simplement les éléments suivants:

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

De la section exec de La référence de commande NirCmd :

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

Exécute une application et spécifiez éventuellement un ou plusieurs paramètres de ligne de commande pour l'application exécutée. Le paramètre [show/ hide /min/max] spécifie si l'application en cours sera visible ou non. Si 'hide' est spécifié, l'application en cours ne sera pas visible pour l'utilisateur. Si 'max' est spécifié, la fenêtre de l'application en cours sera agrandie. Si 'min' est spécifié, la fenêtre de l'application en cours d'exécution sera minimisée.

EDIT: J'essayais d'exécuter un travail ROBOCOPY et j'ai essayé la méthode dans cette réponse, et cela n'a pas fonctionné, même après l'édition les privilèges d'accès au réseau. J'ai essayé de double-cliquer sur le script et je n'ai pas pu le faire fonctionner, mais je ne pouvais que le faire fonctionner sous une invite de commande élevée. J'ai créé un raccourci vers le fichier de commandes et l'ai exécuté en tant qu'administrateur et j'ai pu le faire exécuter en double-cliquant dessus, mais la méthode avec laquelle j'ai fini par le faire était de l'exécuter masqué en tant que SYSTEM (je sais, je sais) - mais cela fonctionne avec ROBOCOPY, pour ce que ça vaut, tant que le fichier batch a les autorisations correctes.

EDIT 2: Pour une raison quelconque, cela ne fonctionnerait pas en tant que SYSTEM (probablement la chose d'accès au réseau référencée plus tôt) - J'ai seulement remarqué cela après avoir réellement exécuté ROBOCOPY sans l'indicateur/L, qui est fondamentalement juste une simulation et [apparemment] ne se connecte pas réellement au système distant, mais lorsque j'exécute le fichier de commandes avec les privilèges les plus élevés et que je vérifie la case cachée, je peux exécutez-le toujours en tant qu'utilisateur connecté en arrière-plan sans afficher de fenêtre de commande, pour tout ce que cela vaut pour n'importe qui.

1
rubynorails

Une autre solution que j'ai utilisée est Hidden Start

0
SteveC