Question 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 batch qui s'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, 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é 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 commandes sans ouvrir une fenêtre cmd?


139
2018-05-17 09:00


origine


J'ai trouvé celui-ci une réponse plus préférable stackoverflow.com/questions/6568736/… - Efekt


Réponses:


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 .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 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 d'exécution:

 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 que l'exécution du programme soit terminée 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 tout 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).

142
2018-05-17 09:08



+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
Je pense sincèrement 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
A la question "Existe-t-il un moyen d'exécuter un script de traitement par lots sans ouvrir une fenêtre de commande?", Il fournit une réponse très directe: exécutez-le à l'aide d'un fichier de script Windows. - Mark Meuer
@Lee Je suppose que les guillemets doubles sont nécessaires si votre chemin contient des espaces. - splattne


Exécutez-vous cela comme une tâche planifiée? Si cette option est configurée pour s'exécuter sous un compte d'utilisateur différent, l'utilisateur connecté ne le verra pas. 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 authorité \ système" 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


55
2018-05-17 09:13



Merci - c'était moins compliqué pour moi que l'option .vbs. - mackenir
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, 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 de Windows. - samsmith
L'utilisateur du système est simple et élégant, excellent TIP! +1! - Matteo Conta
Voir Mise en œuvre 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 ne pas faites cela dans la plupart des situations. - user34660


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


27
2017-10-04 20:06



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


Tu pourrais aussi 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é.


17
2017-07-20 21:54



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


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

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

cmdow @ /hid

ou démarrer un nouveau processus caché avec

cmdow /run /hid mybat.bat 

9
2018-05-17 11:30



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. Le cuit dedans, en utilisant des commandes de fenêtres est beaucoup mieux. - IanVaughan
Plus cmdow est détecté comme "dangereux" par certains programmes antivirus (il est ne pas dangereux, mais la détection peut elle-même causer des problèmes si le fichier cmdow est mis en quarantaine ...). - Otiel
il y a encore une console popup, il suffit de flasher très vite. - Bamboo


Essayez d’appeler le script avec

start /b <command>

5
2018-05-17 14:54



Cela ne fonctionne pas, la tâche planifiée -> État indique "Impossible de démarrer", c’est-à-dire: start / b C: \ fichier.bat: et: start / b "C: \ fichier.bat": mais: C: \ file.bat: fonctionne très bien. - IanVaughan
Parce que start n'est pas un programme, c'est une commande. Vous devez spécifier cmd comme le programme à exécuter et /c start /b <file> comme argument. Cependant, cela ne fonctionnera toujours pas car cela créera toujours une fenêtre de console pour cmd et clignote une fenêtre noire sur l'écran. - Synetech
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


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 devrez 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 d’y accéder, il vous faudra utilement se rediriger vers tout ce que le raccourci pointe.


5
2017-08-11 16:49



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


Je me rends compte que cette question a déjà été résolue avec une résolution parfaitement bonne, native de Windows et qui devrait donc ê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 à donner un accès root au script. Il échouera également pour des emplois tels que ROBOCOPY (référencé par John Rennie), qui nécessitent un accès réseau.

je n'ai jamais essayé CMDOW Avant, mais je voudrais proposer une autre résolution similaire, qui [bien que n’est pas installée nativement sur Windows] est toujours très portable pour la plupart des versions, et existe en versions 32 et 64 bits, c’est-à-dire 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"

Du exec section de La 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 spectacle/cacher/ min / max] paramètre 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.

MODIFIER: J'essayais de courir un ROBOCOPY travail et essayé 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 ça marche avec ROBOCOPY, pour ce que cela vaut, tant que le fichier de commandes a les autorisations 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é ROBOCOPY sans le drapeau / L, qui est fondamentalement juste une simulation et [apparemment] ne se connecte pas réellement 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 que utilisateur connecté en arrière-plan sans fenêtre de commande, quelle que soit sa valeur.


1
2018-05-01 03:38





Une autre solution que j'ai utilisée est Départ caché


0
2017-07-01 07:38





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é.


-2
2017-08-13 11:58





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

@echo off

-2
2017-09-01 16:01