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

143

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

J'ai réussi à faire paraître la fenêtre réduite en faisant exécuter le travail planifié.

cmd /c start /min mybat.bat

mais cela me donne une nouvelle fenêtre de commande toutes les heures. Cela m'a surpris, étant donné que cmd /c"Exécute la commande spécifiée par string puis se termine" - je dois avoir mal compris la documentation.

Existe-t-il un moyen d'exécuter un script de traitement par lots sans que cela ne fasse apparaître une fenêtre cmd?

Tom Dunham
la source
J'ai trouvé celui-ci une réponse plus préférable stackoverflow.com/questions/6568736/…
Date:

Réponses:

144

Vous pouvez l'exécuter en mode silencieux à l'aide d'un fichier de script Windows. La méthode d'exécution vous permet d'exécuter un script en mode invisible. Créer un .vbsfichier 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 programmer. Le deuxième argument de cet exemple définit le style de la fenêtre. 0 signifie "cacher 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'interrompt jusqu'à la fin du programme et Run renvoie le code d'erreur renvoyé par le programme. Si la valeur est false (valeur par défaut), la méthode Run retourne immédiatement après le démarrage du programme et renvoie automatiquement 0 (ne doit pas être interprétée comme un code d'erreur).
éclabousser
la source
+1, vient d'écrire exactement la même chose
Sam Cogan
Je l'ai vu avant de le supprimer. Je suppose que nous sommes tous les deux des robots. ;-)
splattne
1
Je pense honnêtement que Sam le mérite bien plus que moi. Mais merci quand même! Et ne mentionnez pas moi et Jon Skeet dans la même phrase. C'est un blasphème! ;-)
splattne
3
A la question "Existe-t-il un moyen d'exécuter un script batch sans que cela ne fasse apparaître une fenêtre cmd?", Il donne une réponse très directe: exécutez-le à l'aide d'un fichier de script Windows.
Mark Meuer
2
@ Lee Je suppose que les guillemets doubles sont nécessaires si votre chemin contient des espaces.
Splattne
58

Exécutez-vous cela comme une tâche planifiée? Si tel est le cas, 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 autorisation Windows (tels que des partages de fichiers ou des imprimantes), vous pouvez l'exécuter en tant que "nt author \ system" et laisser le mot de passe vide. Sous Windows 7, configurez simplement l'utilisateur sur SYSTEM et appuyez sur OK.

(Vous devrez probablement utiliser un utilisateur réel si vous utilisez robocopy ...)

JR

John Rennie
la source
3
Merci - c'était moins compliqué pour moi que l'option .vbs.
mackenir
8
J'ai défini l'utilisateur "Exécuter en tant que" sur SYSTEM (qui a par la suite changé de NT AUTHORITY \ SYSTEM) et cela a fonctionné pour moi. Je ne vois plus la fenêtre CMD contextuelle lorsque ma tâche planifiée est exécutée. Merci!
Ryan Stille
1
+1, c'est élégant. Assurez-vous de saisir "système" comme nom d'utilisateur, puis win7 fera le reste à votre place. Notez que vous obtenez un accès réseau à Internet, mais pas aux partages réseau et autres choses nécessitant une autorisation Windows.
samsmith
1
L'utilisateur du système est simple et élégant, excellent TIP! +1!
Matteo Conta
1
Reportez -vous à la section Implémentation de modèles administratifs offrant le moins de privilèges . L'utilisation du compte système pour cela est-elle une violation des stratégies des privilèges minimaux? Si tel est le cas, les administrateurs doivent savoir qu'il ne faut pas le faire dans la plupart des situations.
user34660
29

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

Peter Meinl
la source
6
Parfait! Vous pouvez même désactiver le stockage des identifiants, ce qui finit par être plus sécurisé que si SYSTEM l'exécutait!
binki
17

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

CHP.EXE mybat.bat

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

rocketmonkeys
la source
Fonctionne parfaitement lorsque vous devez exécuter la tâche dans le contexte de l'utilisateur connecté ("Déclencheur: lors de la connexion à une session d'utilisateur", "Exécuter la tâche en tant que: Utilisateurs")
Sergei
1
ce n'est pas un outil
intégré
9

CMDOW est un outil formidable qui vous permet de faire beaucoup de choses dans Windows depuis la ligne de commande.

Une des choses les plus simples à faire est de cacher la fenêtre courante (généralement en première ligne du fichier bat) avec:

cmdow @ /hid

ou démarrer un nouveau processus caché avec

cmdow /run /hid mybat.bat 
Itsadok
la source
4
Ceci et la suggestion de Rocketmonkeys impliquent le téléchargement de nouveaux outils, ce qui signifie une compatibilité accrue sur les ordinateurs de bureau de différents peuples. L'utilisation de commandes Windows est bien meilleure.
IanVaughan
De plus, certains programmes antivirus détectent le "danger" de cmdow (ce n’est pas un danger, mais la détection peut elle-même causer certains problèmes si le fichier cmdow est mis en quarantaine ...).
Otiel
3
il y a encore une console popup, il suffit de flasher très vite.
Bamboo
5

Essayez d’appeler le script avec

start /b <command>

la source
1
Cela ne fonctionne pas, la tâche planifiée-> Etat indique "Impossible de démarrer", c’est-à-dire: start / b C: \ file.bat: et: start / b "C: \ file.bat": mais: C: \ file.bat: fonctionne très bien.
IanVaughan
1
Parce que ce startn'est pas un programme, c'est une commande. Vous devez spécifier cmdle programme à exécuter et /c start /b <file>l'argument. Cependant, cela ne fonctionnera toujours pas, car cela créera toujours une fenêtre de console cmdet affichera une fenêtre noire à l'écran.
Synetech
1
Vous pouvez également confirmer avec @Synetech que cela ne créera pas de nouvelle fenêtre, mais vous devez toujours ouvrir une fenêtre de console pour pouvoir la démarrer. Cette commande est pratique, mais ne peut pas être utilisée comme demandé avec les tâches planifiées.
JonathanDavidArndt
5

Vous pouvez créer un raccourci vers le fichier de commandes, définir le raccourci de manière à ce qu'il soit réduit au minimum (dans les propriétés du raccourci, dans l'onglet 'Raccourci'), puis définir le travail de manière à démarrer le raccourci.

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

Doug Kavendek
la source
Cela ne fonctionne pas sous Windows 10 x64, cela donne une fenêtre "Comment voulez-vous ouvrir ce fichier?"
Jan
1

Je me rends compte que cette question a déjà été résolue avec une résolution parfaitement bonne, native de Windows et donc devrait être la plus compatible, et je suis tout à fait d’accord.

Je voulais également dire que je ne suis pas d'accord avec le commentaire de @ splattne (mais pas sa réponse réelle), à ​​savoir que la résolution de l'autre fil de discussion cité mérite le crédit. Cette réponse implique d'exécuter le script en tant qu'utilisateur différent (SYSTEM), ce qui revient à peu près à donner au script un accès racine. Il échouera également pour des travaux tels que ROBOCOPY(comme référencé par John Rennie), qui nécessitent un accès réseau.

Je n'ai jamais essayé CMDOWauparavant, mais j'aimerais proposer une autre résolution similaire, qui [bien que n'étant pas installée en mode natif sous Windows] reste très portable pour la plupart des versions, et existe en versions 32 et 64 bits, à savoir NirCmd .

NirCmd est un outil très puissant qui offre une myriade d'options, dont la plus utile, que je trouve personnellement, est sa capacité à lancer des fenêtres de commande cachées en exécutant simplement ce qui suit:

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

Dans la execsection Référence de la commande NirCmd :

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

Exécute une application et spécifie é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 d'exécution sera visible ou non. Si 'masquer' est spécifié, l'application en cours d'exécution ne sera pas visible pour l'utilisateur. Si 'max' est spécifié, la fenêtre de l'application en cours d'exécution sera maximisée. Si 'min' est spécifié, la fenêtre de l'application en cours d'exécution sera réduite.

EDIT: J'essayais d'exécuter un ROBOCOPYtravail et d'essayer la méthode dans cette réponse, et cela n'a pas fonctionné, même après avoir modifié les privilèges d'accès au réseau. J'ai essayé de double-cliquer sur le script et je ne pouvais pas le faire fonctionner, mais je ne pouvais le faire fonctionner que sous une invite de commande élevée. J'ai créé un raccourci vers le fichier de commandes et je l'ai exécuté en tant qu'administrateur. J'ai pu le faire exécuter en double-cliquant dessus, mais la méthode utilisée a été de l'exécuter caché en tant que SYSTEM (je sais, je sais) - mais cela fonctionne ROBOCOPYpour ce que ça vaut, tant que le fichier batch a les permissions appropriées.

EDIT 2: pour une raison quelconque, cela ne fonctionnerait pas en tant que SYSTEM (probablement l’accès réseau mentionné plus haut) - je ne l’ai remarqué qu'après avoir exécuté ROBOCOPYle drapeau / L, qui est essentiellement une simulation et qui [apparemment] ne fonctionne pas Je me connecte effectivement au système distant, mais lorsque je lance le fichier de commandes avec les privilèges les plus élevés et que je coche la case cachée, je peux toujours l'exécuter en tant qu'utilisateur connecté en arrière-plan sans afficher de fenêtre de commande, quelle qu'en soit la valeur pour quiconque .

rubynorails
la source
-2

Essayez de placer une commande de sortie à la fin de votre fichier de commandes. Cela devrait fermer la fenêtre de commande lorsque le script est terminé.

Brian S. Wilson
la source
-2

Pour masquer la sortie (mais pas la fenêtre), ajoutez ceci au début de votre fichier batch:

@echo off
voidstate
la source