web-dev-qa-db-fra.com

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

J'ai un script "d'installation" que je lance le matin et qui lance tous les programmes dont j'ai besoin. Certains d’entre eux ont maintenant besoin d’une configuration supplémentaire de l’environnement. Je dois donc les envelopper dans de petits scripts BAT.

Comment puis-je 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 que lorsque la commande du script env est terminée.

START/B env-script.bat exécute une autre instance de CMD.exe dans la même invite de commande, le laissant dans un état vraiment désordonné (je vois la sortie du CMD.exe imbriqué, le clavier est mort pendant un moment, le 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.

81
Aaron Digulla

En fait, cela fonctionne 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 les paramètres à start, tels que /min, comme l'a souligné Moshe si vous ne voulez pas que les nouvelles fenêtres apparaissent sous vos yeux.

66
Joey

Deux ans, mais pour être complet ...

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

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

Remarques: 1. CALL est associé au fichier .bat car il se trouve généralement là où il se trouve .. (c’est-à-dire qu’il s’agit d’une extension du formulaire CMD /C CALL "foo.bat" pour le rendre asynchrone. En général, il est nécessaire d’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 est plus probable que cela se produise.) 

Si vous ne voulez 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 vous souhaitez que l’autre fenêtre traîne ensuite:

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

Remarque: il s’agit d’un format médiocre, sauf si certains utilisateurs souhaitent utiliser la fenêtre ouverte en tant que console normale. Si vous souhaitez simplement que la fenêtre reste visible afin de voir la sortie, il est préférable de mettre une PAUSE à la fin du fichier bat. Ou même encore, ajoutez ^& PAUSE après la ligne de commande:

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

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 une priorité plus basse avec/LOW ou/BELOWNORMAL, ce qui devrait améliorer la réactivité de votre système.

7
Moshe

Un autre moyen de masquer la fenêtre en cours consiste à utiliser vbscript, s'il est toujours 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 depuis chauve-souris, mettez-le dans une tâche planifiée, etc. ... Personnellement, je vais désactiver vbs sans hâte sur aucun système Windows que je gère :)

3
MeaCulpa

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

call notepad.exe & 
0
MiiToo

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();
}
0
LegendLength

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

c:\start BATCH.bat -WindowStyle masqué

0
user8832474