web-dev-qa-db-fra.com

Windows XP ou version ultérieure) Windows: Comment puis-je exécuter un fichier de commandes en arrière-plan sans fenêtre?

Je sais que j'ai déjà répondu à une question similaire ( Exécution d'un fichier de traitement par lots en arrière-plan lors du démarrage de Windows ), mais cette fois, je dois lancer un lot:

  • d'un autre lot,
  • sans aucune fenêtre de console affichée,
  • avec tous les arguments transmis au lot invisible.

Le premier lot est exécuté dans une fenêtre de console. Cependant, je ne souhaite pas que le deuxième lot (lancé par le premier de manière asynchrone ) affiche également une fenêtre de console.

J’ai mis au point un script VBScript qui fait exactement cela, et j’ai mis le script sous la forme réponse à laquelle les autres se réfèrent , mais si vous avez d’autres idées/solutions, n'hésitez pas à contribuer.

Remarque: La fenêtre de la console du processeur de commande Windows est nommée fenêtre DOS pas vraiment correcte par de nombreuses personnes.


Merci à tous pour les réponses. D'après ce que j'ai compris, si j'ai besoin d'appeler de manière asynchrone un script pour qu'il s'exécute en mode invisible:

  • À partir d'un second script déjà présent dans une fenêtre de console, start /b est suffisant.
  • Sous Windows, sans déclencher une deuxième fenêtre, ma solution est toujours valide.
117
VonC

Avez-vous besoin que le deuxième fichier de commandes s'exécute de manière asynchrone? Généralement, un fichier de commandes en exécute un autre de manière synchrone avec la commande call, le second partageant la fenêtre du premier.

Vous pouvez utiliser start /b second.bat pour lancer un deuxième fichier batch a de manière synchrone depuis le premier qui partage la fenêtre de votre premier. Si les deux fichiers de traitement par lots écrivent simultanément sur la console, la sortie sera superposée et probablement indéchiffrable. En outre, vous voudrez mettre une commande exit à la fin de votre deuxième fichier de commandes, ou vous serez dans une seconde cmd Shell une fois que tout sera terminé.

53
P Daddy

Voici une solution possible:

Depuis 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:

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

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

  • intWindowStyle: 0 signifie "fenêtres invisibles"
  • bWaitOnReturn: false signifie que votre premier script n'a pas besoin d'attendre la fin de votre second script

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
109
VonC

Convertir le fichier de commandes à un fichier .exe Essayez Bat to Exe Converter ou Online Bat To Exe Converter , et choisissez l'option de l'exécuter en tant qu'application fantôme, c'est-à-dire sans fenêtre.

12
Rob Kam

Je pense que c'est la solution la plus simple et la plus courte pour exécuter un fichier de commandes sans ouvrir la fenêtre DOS. Cela peut être très gênant lorsque vous souhaitez planifier l'exécution périodique d'un ensemble de commandes; la fenêtre DOS continue donc de s'afficher, voici la solution. . Utilisez 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 

Copiez les lignes ci-dessus dans un éditeur et enregistrez le fichier avec l’extension .VBS. Modifiez le nom du fichier .BAT et son chemin en conséquence.

9
indago

Voici ma collection de méthodes pour y parvenir - et même plus - où il était possible que j'ai essayé de renvoyer également le PID du processus démarré (tous les scripts liés peuvent être téléchargés et enregistrés avec le nom que vous préférez):

1) La solution IEXPRESS peut être utilisée même sur une ancienne victoire 95/98 Machines. Iexpress est un outil très ancien, toujours fourni avec Windows. En tant qu'arguments, seul la commande et ses arguments sont acceptés.

Exemple d'utilisation:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS - N'accepte à nouveau que deux arguments - la commande et les arguments .Vérifie également s’il est démarré avec des autorisations élevées et, si possible, obtient le PID du processus avec WEVTUTIL (disponible à partir de Vista et supérieur pour que la nouvelle version de Windows reçoive le PID).

Exemple d'utilisation:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell' - le script est un wrapper complet de 'WScript.Shell' et toutes les options possibles peuvent être défini via les options de ligne de commande. Il s’agit d’un hybride jscript/batch et peut être appelé en tant que.

Exemple d'utilisation (pour plus d'informations, imprimer l'aide avec '-h'):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' - à nouveau le wrapper complet et toutes les options sont accessibles via les arguments de la ligne de commande. Cette fois, il s'agit de WSF/batch hybride avec du JScript et du VBScript, mais renvoie le PID du processus démarré. Si le processus n'est pas masqué, certaines options telles que les coordonnées X/Y peuvent être utilisées (non applicable pour tous les exécutables, mais par exemple cmd.exe. accepte les coordonnées).

Exemple d'utilisation (pour plus d'informations, imprimer l'aide avec '-h'):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5) Le. solution NET. La plupart des options de ProcessStartInfo sont utilisées (mais à la fin, j'étais trop fatigué pour tout inclure):

Exemple d'utilisation (pour plus d'informations, imprimer l'aide avec '-h'):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal
7
npocmaka

Exécutez-le sous un nom d'utilisateur différent, en utilisant "runas" ou en le planifiant sous un autre utilisateur dans les tâches planifiées Windows.

2
JosephStyons

Dans l'autre question, j'ai suggéré autoexnt . C'est également possible dans cette situation. Il suffit de configurer le service pour qu'il s'exécute manuellement (c.-à-d. Qu'il n'est pas automatique au démarrage). Lorsque vous souhaitez exécuter votre lot, modifiez le fichier autoexnt.bat pour appeler le fichier de lot souhaité et démarrez le service autoexnt.

Le fichier de commandes pour démarrer ceci peut ressembler à ceci (non testé):

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

Notez que les fichiers de commandes ainsi démarrés sont exécutés en tant qu'utilisateur système, ce qui signifie que vous n'avez pas automatiquement accès aux partages réseau. Mais vous pouvez utiliser Net Utilisez pour vous connecter à un serveur distant.

Vous devez télécharger le Kit de ressources Windows 20 pour l'obtenir. Le Kit de ressources peut également être installé sur d'autres versions de Windows, telles que Windows XP.

2
wimh

Vous pouvez aussi utiliser

start /MIN notepad.exe

PS: Malheureusement, le statut de la fenêtre minimisé dépend de la commande à exécuter. V.G. ne travaille pas

start /MIN calc.exe
0
user2928048

Vous pouvez exécuter votre fichier .bat via un fichier .vbs
Copiez le code suivant dans votre fichier .vbs:

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 
0
Vinod Chelladurai