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

90

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

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

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

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

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

Aaron Digulla
la source

Réponses:

71

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

test.cmd:

@echo off
call "cmd /c start test2.cmd"
call "cmd /c 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 des paramètres starttels que /min, comme l'a souligné Moshe si vous ne voulez pas que les nouvelles fenêtres apparaissent devant vous.

Joey
la source
1
D'accord, cela fonctionne mais n'est pas parfait à 100%: après avoir appuyé sur "RETURN" dans "Test 2", cette fenêtre ne se ferme pas. Des idées?
Aaron Digulla
Vous pouvez ajouter "exit" aux lots générés pour les refermer par la suite. Désolé, je n'ai pas testé si loin :)
Joey
140

Deux ans, mais par souci d'exhaustivité ...

Approche standard en ligne: (c'est-à-dire le comportement que vous obtiendriez lors de l'utilisation &sous Linux)

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

Remarques: 1. CALLest associé au fichier .bat parce que c'est là où il va habituellement .. (c'est-à-dire qu'il ne s'agit que d'une extension du CMD /C CALL "foo.bat"formulaire pour le rendre asynchrone. Habituellement, il est nécessaire d'obtenir correctement les codes de sortie, mais ce n'est pas un problème ici.); 2. Les guillemets doubles 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 cela.).

Si vous ne voulez pas la sortie:

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

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

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

Si vous voulez que l'autre fenêtre traîne par la suite:

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

Remarque: Il s'agit en fait d'une forme médiocre, sauf si vous avez des utilisateurs qui souhaitent spécifiquement utiliser la fenêtre ouverte comme une console normale. Si vous voulez juste que la fenêtre reste pour voir la sortie, il vaut mieux mettre un PAUSEà la fin du fichier chauve-souris. Ou même encore, ajoutez ^& PAUSEaprès la ligne de commande:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
antak
la source
10
&est un opérateur "et alors" (terminologie?). (par exemple cmd1 & cmd2signifie faire "cmd1" puis "cmd2". Contrairement à l' &&opérateur, l'exécution de "cmd2" ne dépend pas de la sortie réussie de "cmd1".) L' ^échappe le &pour 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.
antak
Ceci est très utile, merci. J'étais sur le point de porter certains scripts sur Linux, car d'autres guides startet cmdne donnaient pas toutes les fonctionnalités que je recherchais. Votre réponse le cloue.
Iterator
3
Si vous ne voulez pas la sortie, la redirection doit être échappée afin qu'elle soit transmise à CMD. L'appel n'est pas non plus nécessaire:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham
1
@dbenham: Bien que ce que vous dites ait du sens, START /B "" CMD /C PING 127.0.0.1 >NULsemble fonctionner malgré tout et rien n'est produit. (Probablement parce qu'il CMDhérite STARTdes poignées d'E / S.) Je suppose que la différence est si vous voulez conserver STARTla sortie (d'erreur) intacte, ce qui est probablement une bonne idée. CALLest juste là parce que j'ai senti que c'était une bonne pratique à garder. (c'est-à-dire que ne pas utiliser CALLpour les appels de chauve-souris synchrones entraînera des codes de sortie imprévisibles, donc je CALL
jumelle
7

Puisque START est le seul moyen d'exécuter quelque chose en arrière-plan à partir d'un script CMD, 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é sur quelque chose de plus bas avec / LOW ou / BELOWNORMAL, ce qui devrait améliorer la réactivité de votre système.

Moshe
la source
-1 Le problème est que START ne crée pas de nouvelle fenêtre lorsque vous démarrez un fichier BAT; à la place, il réutilise la fenêtre actuelle et mélange les deux processus CMD d'E / S.
Aaron Digulla
4
Il ne crée pas une nouvelle fenêtre car vous utilisez l'indicateur / B. Retirez-le.
Moshe
5

Autre que terme de premier plan / d'arrière-plan. Une autre façon de masquer la fenêtre en cours est via vbscript, si elle est toujours disponible dans votre système.

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

nommez-le sth.vbs et appelez-le de bat, mettez-le dans une tâche prévue, etc. Personnellement, je désactiverai les vbs sans hâte sur n'importe quel système Windows que je gère :)

Mea culpa
la source
Pour mon cas d'utilisation particulier, c'était en fait la seule solution que je pouvais mettre au travail ...
Ben
0

Créez une nouvelle application Windows C # et appelez cette méthode à partir de 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();
}
LégendeLongueur
la source
2
Euh ... J'espérais que quelque chose d'aussi simple que cela n'aurait pas besoin d'installer Visual Studio ...
Aaron Digulla
1
Jusqu'à ce que PowerShell soit disponible à 100%, C # est vraiment exagéré.
jim
2
Aaron: Le compilateur C # est inclus dans .NET Framework 2, vous pouvez donc simplement éditer du code dans un éditeur de texte et le compiler. Néanmoins, comme cela est parfaitement possible dans un fichier batch, je dirais également que C # est excessif.
Joey
0

Cela fonctionne sur mon installation Windows XP Home, à la manière Unix:

call notepad.exe & 
MiiToo
la source
7
Je pense que cela ne fonctionne que par coïncidence, et le & n'est pas nécessaire.
Sam Watkins
2
Ouais, notepad.exe est asynchrone pour commencer.
antak
0

En fait, c'est assez facile avec cette option à la fin:

c: \ start BATCH.bat -WindowStyle Caché

user8832474
la source
la commande Windows startn'a pas d' -WindowStyleoption.
Stephan
@Stephan Arreed. Le chemin étrange ( C:` instead of C: \ Windows`) suggère qu'il a trouvé un outil quelque part sur Internet et copié sur son disque dur.
Aaron Digulla