99 votes

Comment exécuter un fichier bat en arrière-plan à partir d'un autre fichier bat ?

J'ai un "setup" script que je lance le matin et qui démarre tous les programmes dont j'ai besoin. Maintenant, certains d'entre eux nécessitent une configuration supplémentaire de l'environnement, donc je dois les envelopper dans de petits scripts BAT.

Comment exécuter un tel script en arrière-plan sous Windows XP ?

CALL env-script.bat l'exécute de manière synchrone, c'est-à-dire que l'installation script ne peut continuer qu'après la fin de la commande dans l'env-script.

START/B env-script.bat exécute une autre instance de CMD.exe dans la même invite de commande, la laissant dans un état vraiment désordonné (je vois la sortie du CMD.exe imbriqué, le clavier est mort pendant un moment, script n'est pas exécuté).

START/B CMD env-script.bat donne le même résultat. Aucun des drapeaux dans CMD ne semble correspondre à ma facture.

153voto

antak Points 2202

Deux ans plus tôt, mais pour être complet...

Approche standard, en ligne : (c'est-à-dire le comportement que vous obtiendriez en utilisant & dans Linux)

START /B CMD /C CALL "foo.bat" [args [...]]

Notes : 1. CALL est associé au fichier .bat car c'est là qu'il va habituellement (c'est-à-dire qu'il s'agit simplement d'une extension du fichier .bat). CMD /C CALL "foo.bat" pour le rendre asynchrone. Habituellement, c'est nécessaire pour obtenir correctement les codes de sortie, mais ce n'est pas un problème ici) ; 2. les guillemets autour du fichier .bat ne sont nécessaires que si le nom contient des espaces. (Le nom pourrait être un chemin, auquel cas il y a plus de chances que ce soit le cas).

Si tu ne veux pas la sortie :

START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1

Si vous voulez que la batte soit exécutée sur une console indépendante : (c'est-à-dire une autre fenêtre)

START CMD /C CALL "foo.bat" [args [...]]

Si tu veux que l'autre fenêtre reste dans le coin après :

START CMD /K CALL "foo.bat" [args [...]]

Remarque : Cette méthode est en fait mal conçue, sauf si des utilisateurs souhaitent spécifiquement utiliser la fenêtre ouverte comme une console normale. Si vous souhaitez simplement que la fenêtre reste ouverte afin de voir la sortie, il est préférable de mettre une balise PAUSE à la fin du fichier bat. Ou encore, ajoutez ^& PAUSE après la ligne de commande :

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE

10 votes

& est un opérateur "and then" (terminologie ?). (par exemple cmd1 & cmd2 signifie faire "cmd1" et ensuite "cmd2". Contrairement à la && l'exécution de "cmd2" ne dépend pas de la sortie réussie de "cmd1"). Le site ^ s'échappe de la & de sorte qu'il entre dans les arguments de CMD au lieu d'être consommé et exécuté par la même console qui a exécuté START.

0 votes

C'est très utile, merci. J'étais sur le point de porter quelques scripts sur Linux, car les autres guides de start et cmd n'offrait pas toutes les fonctionnalités que je recherchais. Votre réponse est très claire.

4 votes

Si vous ne voulez pas la sortie, alors la redirection doit être échappée pour qu'elle soit passée à CMD. De plus, CALL n'est pas nécessaire : START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1

72voto

Joey Points 148544

En fait, ce qui suit fonctionne bien pour moi et crée de nouvelles fenêtres :

test.cmd :

@echo off
start test2.cmd
start test3.cmd
echo Foo
pause

test2.cmd

@echo off
echo Test 2
pause
exit

test3.cmd

@echo off
echo Test 3
pause
exit

Combinez cela avec les paramètres de start tels que /min comme l'a souligné Moshe, si vous ne voulez pas que le nouveau Windows apparaisse devant vous.

1 votes

Ok, ça marche mais ce n'est pas parfait à 100% : Après avoir appuyé sur "RETURN" dans "Test 2", cette fenêtre ne se ferme pas. Avez-vous une idée ?

0 votes

Vous pouvez ajouter "exit" aux lots spawnés pour les refermer ensuite. Désolé, je n'ai pas testé aussi loin :)

0 votes

En fait, le script de démarrage 1.bat \n démarrer script2.bat \n démarrer scriptN.bat était suffisant pour moi

9voto

Moshe Points 1724

Puisque START est le seul moyen d'exécuter quelque chose en arrière-plan à partir d'un CMD script, je vous recommande de continuer à l'utiliser. Au lieu du modificateur /B, essayez /MIN pour que la fenêtre nouvellement créée ne vous dérange pas. En outre, vous pouvez définir la priorité à quelque chose de plus faible avec /LOW ou /BELOWNORMAL, ce qui devrait améliorer la réactivité de votre système.

0 votes

-1 Le problème est que START ne crée pas une nouvelle fenêtre lorsque vous lancez un fichier BAT ; au lieu de cela, il réutilise la fenêtre actuelle et mélange les processus I/O deux CMD.

4 votes

Il ne crée pas de nouvelle fenêtre parce que vous utilisez l'option /B. Enlevez-le.

6voto

MeaCulpa Points 388

Autre que le terme avant-plan/arrière-plan. Un autre moyen de masquer une fenêtre en cours d'exécution est le vbscript, s'il est encore disponible dans votre système.

DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)

nommez-le en tant que sth.vbs et appelez-le à partir de bat, mettez-le dans une tâche programmée, etc. Personnellement, je désactiverai vbs sans hâte sur tous les systèmes Windows que je gère :)

0 votes

Pour mon cas particulier, c'était en fait la seule solution que je pouvais faire fonctionner...

0voto

LegendLength Points 327

Créez une nouvelle application Windows C# et appelez cette méthode depuis main :

public static void RunBatchFile(string filename)
{
    Process process = new Process();

    process.StartInfo.FileName = filename;

    // suppress output (command window still gets created)
    process.StartInfo.Arguments = "> NULL";

    process.Start();
    process.WaitForExit();
}

2 votes

Uhm ... J'espérais que quelque chose d'aussi simple que cela ne nécessiterait pas l'installation de Visual Studio ...

1 votes

Jusqu'à ce que PowerShell soit disponible à 100%, C# est vraiment superflu.

2 votes

Aaron : Le compilateur C# est inclus dans le .NET Framework 2, donc vous pouvez simplement éditer du code dans un éditeur de texte et le compiler. Cependant, comme cela est parfaitement possible dans un fichier batch, je dirais également que C# est trop compliqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X