129 votes

Windows XP ou Vista: Comment puis-je exécuter un fichier de commandes dans le fond (pas de windows pour afficher)?

Je sais que j'ai déjà répondu à une question similaire (Fichier Batch en cours d'Exécution en arrière-plan lorsque windows démarre), mais cette fois, j'ai besoin de lancer un batch:

  • À partir d'un autre lot
  • Sans DOS de windows affiche
  • Avec tous les arguments passés à l'invisible lot

Le premier lot est exécuté dans un DOS de windows. Cependant, je ne veux pas le deuxième lot (lancement par le premier dans un asynchrone) également d'afficher une fenêtre DOS.

Je suis venu avec un script VBScript qui ne fait juste que, et j'ai mis le script comme une réponse pour les autres à consulter, mais si vous avez d'autres idées/solutions, n'hésitez pas à contribuer.


Merci à tous pour les réponses. Ce que je comprends, si j'ai besoin de manière asynchrone appel d'un script à exécuter dans un mode invisible:

  • À partir d'un deuxième script déjà dans un DOS, windows, start /b est assez
  • À partir de Windows, sans le déclenchement d'une deuxième fenêtre, ma solution est toujours valide.

113voto

VonC Points 414372

Voici une solution possible:

À partir de votre premier script, appelez votre deuxième script avec la ligne suivante:

wscript.exe invis.vbs run.bat %*

En fait, vous appelez un script vbs avec:

  • l' [chemin]\nom de votre script
  • tous les autres arguments nécessaires à votre script (%*)

Ensuite, invis.vbs appelle votre script avec le Windows Script Host méthode Run() , qui prend:

  • intWindowStyle : 0 signifie "invisible"de windows
  • bWaitOnReturn : false signifie que votre premier script n'a pas besoin d'attendre pour votre deuxième script pour finir

Voici invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
    	anArg = args.Item(k)
    	sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

56voto

P Daddy Points 14228

Vous avez besoin de la deuxième fichier de commandes pour exécuter de manière asynchrone? Généralement, un fichier de commandes exécute une autre façon synchrone avec l' call de commande, et le second partage de la première fenêtre.

Vous pouvez utiliser start /b à la seconde.chauve-souris pour lancer un deuxième lot de fichier d'unemanière synchrone à partir de votre première qui partage votre première fenêtre. Si les deux fichiers batch écrire dans la console en même temps, la sortie sera recouverte et probablement indéchiffrable. Aussi, vous aurez envie de mettre un exit commande à la fin de votre deuxième fichier de commandes, ou vous serez à l'intérieur d'un second cmd coque une fois que tout est terminé.

12voto

Rob Kam Points 3558

Convertir des fichiers par lots pour un exe. Essayez Bat to Exe Converter ou en Ligne Bat to Exe Converter, et choisissez l'option exécuter en tant qu'un fantôme de l'application, c'est à dire pas de fenêtre.

10voto

indago Points 580

Je pense que c'est le plus facile et le plus court de solution à l'exécution d'un fichier de commandes sans ouvrir la fenêtre DOS, il peut être très distrayant quand vous voulez programmer une série de commandes à exécuter périodiquement, de sorte que le DOS de la fenêtre de garde poping up, voici votre solution. Utiliser un Script VBS pour appeler le fichier de commandes ...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

Copier les lignes ci-dessus à un éditeur de texte et enregistrez le fichier .VBS extension. Modifier la .Chauve-souris de nom de fichier et chemin d'accès en conséquence.

2voto

Wimmel Points 7641

Dans l'autre question, j'ai suggéré autoexnt. C'est également possible dans cette situation. Il suffit de régler le service à exécuter manuellement (c'est à dire pas automatique au démarrage). Lorsque vous voulez exécuter votre lot, de modifier la autoexnt.le fichier bat pour appeler le fichier de commandes que vous voulez, et de commencer le service autoexnt.

Le fichier batch pour commencer cette, peut ressembler à ceci (non testé):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

Notez que les fichiers batch commencé de cette manière exécuter en tant qu'utilisateur système, ce qui signifie que vous n'avez pas accès à des partages réseau automatiquement. Mais vous pouvez utiliser de l'utilisation des moustiquaires pour se connecter à un serveur distant.

Vous devez télécharger le Windows 2003 Resource Kit pour l'obtenir. Le Kit de Ressources peut également être installé sur d'autres versions de windows, comme Windows XP.

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