web-dev-qa-db-fra.com

Masquer la fenêtre de commande du fichier .BAT qui exécute un autre fichier .exe

Ceci est un fichier batch sous Windows.

Voici mon fichier .bat

@echo off
copy "C:\Remoting.config-Training" "C:\Remoting.config"

"C:\ThirdParty.exe"

Cela fonctionne correctement, sauf que le fichier .bat laisse la fenêtre de commande ouverte pendant tout le temps que l'application "ThirdParty" est en cours d'exécution.
J'ai besoin de la fenêtre de commande pour se fermer.

J'utiliserais le raccourci pour l'application, mais je dois être capable d'exécuter cette commande de copie en premier (elle change en fait la base de données et le serveur à utiliser pour l'application).

L'application ThirdParty ne permet pas à l'utilisateur de changer la source de la base de données ou le serveur d'applications.

Nous faisons cela pour permettre aux utilisateurs de passer d'un environnement de test à un environnement de production.

53
JeffO

Utiliser start fonctionne pour moi:

@echo off
copy "C:\Remoting.config-Training" "C:\Remoting.config"
start C:\ThirdParty.exe

EDIT: Ok, en regardant de plus près, start semble interpréter le premier paramètre comme le titre de la nouvelle fenêtre si elle est citée. Ainsi, si vous devez indiquer le chemin d'accès à votre ThirdParty.exe, vous devez également fournir une chaîne de titre.

Exemples:

:: Title not needed:
start C:\ThirdParty.exe

:: Title needed
start "Third Party App" "C:\Program Files\Vendor\ThirdParty.exe"
43
cg.

Créer un .vbs fichier avec ce code:

CreateObject("Wscript.Shell").Run "your_batch.bat",0,True

Cette .vbs va courir your_batch.bat caché.

Fonctionne bien pour moi.

22
jlenfers

Essaye ça:

@echo off 
copy "C:\Remoting.config-Training" "C:\Remoting.config"
start C:\ThirdParty.exe
exit
9
QAZ

Excellent conseil. Cela fonctionne avec les fichiers batch qui exécutent un programme Java également.

start javaw -classpath "%CP%" main.Main
7
Josy

Utiliser start fonctionne bien, sauf si vous utilisez un langage de script. Heureusement, il existe un moyen de sortir Python - utilisez simplement pythonw.exe au lieu de python.exe:

:: Title not needed:
start pythonw.exe application.py

Si vous avez besoin de devis, procédez comme suit:

:: Title needed
start "Great Python App" pythonw.exe "C:\Program Files\Vendor\App\application.py"
6
mzuther

Vous voudrez peut-être essayer mon programme silentbatch , qui lancera un .bat/.cmd script, supprime entièrement la création de la fenêtre d'invite de commandes (pour ne pas la voir apparaître puis disparaître) et éventuellement enregistrer le résultat dans un fichier spécifié.

3
jamesdlin

Vous pouvez créer un script VBS qui forcera la fenêtre à être masquée.

Set WshShell = WScript.CreateObject("WScript.Shell")
obj = WshShell.Run("""C:\Program Files (x86)\McKesson\HRS
Distributed\SwE.bat""", 0)
set WshShell = Nothing

Ensuite, plutôt que d'exécuter le fichier de commandes, exécutez le script.

3
Paul Barnett

Je n'ai pas vraiment trouvé le bon moyen de le faire en natif, alors j'utilise un utilitaire appelé hstart qui le fait pour moi. S'il y a une manière plus ordonnée de le faire, ce serait bien.

3
Oskar Duveborn

Ou vous pouvez utiliser:

Start /d "the directory of the executable" /b "the name of the executable" "parameters of the executable" %1

Si% 1 est un fichier, il est transmis à votre exécutable. Par exemple dans notepad.exe foo.txt% 1 est "foo.txt".

Le /b paramètre de la commande de démarrage fait ceci:

Démarre une application sans ouvrir une nouvelle fenêtre d'invite de commande. CTRL+C la gestion est ignorée sauf si l'application permet CTRL+C En traitement. Utilisation CTRL+BREAK d'interrompre l'application.

Ce qui est exactement ce que nous voulons.

2
Egoadsr

Compilez le fichier de commandes dans un fichier exécutable à l’aide de Batch2Exe http://www.f2ko.de/programs.php?lang=en&pid=b2e . Utilisez l'option "Fenêtre invisible".

2
Vinayak Gadkari

S'il vous plaît utiliser celui-ci, ce qui précède ne fonctionne pas. J'ai testé dans Windows Server 2003.

@echo off 
copy "C:\Remoting.config-Training" "C:\Remoting.config"
Start /I "" "C:\ThirdParty.exe"
exit
1
Anmol Gupta

Pour que la fenêtre de commande d'un fichier .bat qui exécute une sortie de fichier .exe le plus rapidement possible, utilisez la ligne @start avant le fichier que vous essayez d’exécuter. Voici un exemple:

(insert other code here)
@start executable.exe
(insert other code here)

Vous n'êtes pas obligé d'utiliser un autre code avec @start executable.exe.

1
user7669241

À l'aide de l'API Windows, nous pouvons démarrer un nouveau processus, une application console et masquer sa fenêtre "noire". Cela peut être fait lors de la création du processus et éviter d'afficher la fenêtre "noire".

Dans CreateProcess , le paramètre dwCreationFlags peut avoir CREATE_NO_WINDOW

The process is a console application that is being run
without a console window. Therefore, the console handle
for the application is not set. This flag is ignored if
the application is not a console application

Voici un lien vers exécutable hide-win32-console-window en utilisant cette méthode et code source .

hide-win32-console-window est similaire à le programme silentbatch de Jamesdlin .

Il y a une question ouverte: que faire avec la sortie du programme lorsque sa fenêtre n'existe pas? Et si des exceptions se produisaient? Pas une bonne solution pour jeter la sortie. hide-win32-console-window utilise des canaux anonymes pour rediriger la sortie du programme vers un fichier créé dans le répertoire en cours.

Usage

batchscript_starter.exe complet/chemin/vers/application [ arguments à transmettre =]

Exemple en cours d'exécution python

batchscript_starter.exe c:\Python27\python.exe -c "import time; print('prog start'); time.sleep(3.0); print('prog end');"

Le fichier de sortie est créé dans le répertoire de travail nommé python.2019-05-13-13-32-39.log avec le résultat de la commande python:

prog start
prog end

Exemple de commande en cours d'exécution

batchscript_starter.exe C:\WINDOWS\system32\cmd.exe /C dir .

Le fichier de sortie est créé dans le répertoire de travail nommé cmd.2019-05-13-13-37-28.log avec sortie de CMD:

 Volume in drive Z is Storage
 Volume Serial Number is XXXX-YYYY

 Directory of hide_console_project\hide-win32-console-window

2019-05-13  13:37    <DIR>          .
2019-05-13  13:37    <DIR>          ..
2019-05-13  04:41            17,274 batchscript_starter.cpp
2018-04-10  01:08            46,227 batchscript_starter.ico
2019-05-12  11:27             7,042 batchscript_starter.rc
2019-05-12  11:27             1,451 batchscript_starter.sln
2019-05-12  21:51             8,943 batchscript_starter.vcxproj
2019-05-12  21:51             1,664 batchscript_starter.vcxproj.filters
2019-05-13  03:38             1,736 batchscript_starter.vcxproj.user
2019-05-13  13:37                 0 cmd.2019-05-13-13-37-28.log
2019-05-13  04:34             1,518 LICENSE
2019-05-13  13:32                22 python.2019-05-13-13-32-39.log
2019-05-13  04:55                82 README.md
2019-05-13  04:44             1,562 Resource.h
2018-04-10  01:08            46,227 small.ico
2019-05-13  04:44               630 targetver.h
2019-05-13  04:57    <DIR>          x64
              14 File(s)        134,378 bytes
               3 Dir(s)  ???,???,692,992 bytes free

Exemple de raccourci pour l'exécution du script .bat

Shortcut for starting windowless .bat file

Champ Target:

C:\batchscript_starter.exe C:\WINDOWS\system32\cmd.exe /C C:\start_wiki.bat

Répertoire spécifié dans Start in Le champ contiendra les fichiers de sortie.

1
Alex

exécutez-le sous un autre utilisateur. en supposant qu'il s'agisse d'une fenêtre, créez un compte utilisateur pour les tâches planifiées. lancez-le en tant qu'utilisateur. La commande Invite ne s'affiche que pour l'utilisateur actuellement connecté.

1
Joe

J'ai utilisé cela pour démarrer un fichier cmd à partir de C #:

Process proc = new Process();
proc.StartInfo.WorkingDirectory = "myWorkingDirectory";
proc.StartInfo.FileName = "myFileName.cmd";
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
proc.WaitForExit();
1
Mike