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

121

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

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

Le premier lot est exécuté dans une fenêtre de console. Cependant, je ne veux pas du 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 comme une réponse à laquelle les autres peuvent se référer peuvent , mais si vous avez d'autres idées / solutions, n'hésitez pas à contribuer.

Remarque: la fenêtre de 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 je comprends, si j'ai besoin d'appeler de manière asynchrone un script à exécuter en mode invisible:

  • A partir d'un deuxième script déjà dans une fenêtre de console, start /bc'est suffisant.
  • Depuis Windows, sans déclencher une seconde fenêtre , ma solution est toujours valable.
VonC
la source
Vous lancez le fichier batch à partir d'UN AUTRE fichier batch? Ce fichier batch déjà en cours d'exécution a-t-il une fenêtre?
Oddthinking
Oui, cet autre (premier) lot est exécuté dans une fenêtre DOS. Cependant, je ne veux pas que le deuxième lot (lancement par le premier de manière asynchrone) affiche également une fenêtre (ce qui se produirait avec une commande 'start / b')
VonC

Réponses:

53

Avez-vous besoin du deuxième fichier de commandes pour s'exécuter de manière asynchrone? En règle générale, un fichier de commandes en exécute un autre de manière synchrone avec la callcommande, et le second partage la fenêtre du premier.

Vous pouvez utiliser start /b second.bat pour lancer un deuxième fichier batch de manière synchrone à partir de votre premier qui partage la fenêtre de votre premier. Si les deux fichiers de commandes écrivent simultanément sur la console, la sortie sera superposée et probablement indéchiffrable. De plus, vous voudrez mettre une exitcommande à la fin de votre deuxième fichier de commandes, ou vous serez dans un deuxième cmdshell une fois que tout sera fait.

Papa
la source
1
Correct. Je pensais que start / b ouvrirait une nouvelle fenêtre, mais s'il est exécuté à partir d'une fenêtre DOS, il partage les mêmes fenêtres.
VonC
110

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:

  • 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 que votre deuxième script se termine

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
VonC
la source
3
2k vues et quel excellent post + réponse, plus de gens devraient voter pour ce fil
Ric Tokyo
Excellente solution, exactement ce dont j'avais besoin.
nikhil le
Le seul problème est que cela crée un processus nommé "cmd.exe", qui est difficile à trouver à l'avenir.
Aditya Gupta le
12

Convertissez le fichier de commandes en un 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.

Rob Kam
la source
3
Possible, mais j'essaierai d'éviter toute étape supplémentaire dans ce cas.
VonC
21
Je ne suis généralement pas si paranoïaque, mais ne serait-il pas très stupide de laisser quelqu'un anonyme générer cet exe pour moi? Toutes sortes de trucs malveillants pourraient être injectés.
Tobias
9

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 un ensemble de commandes à exécuter périodiquement, donc la fenêtre DOS continue de s'afficher, voici votre 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 et le chemin du fichier .BAT en conséquence.

indago
la source
1
Approche intéressante, certainement plus courte que ma solution. +1
VonC
Excellente solution. En lisant ceci, j'ai remarqué qu'il n'y avait pas vraiment besoin d'utiliser Set WshShell = Nothing, cela a bien fonctionné pour moi et vous pouvez avoir un moyen encore plus petit de le faire.
Patrick Bard
7

Voici ma collection de moyens pour y parvenir - et même plus - là où il était possible, 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 sous le nom que vous trouvez pratique):

1) Le solution IEXPRESS peut être utilisée même sur les anciennes machines win 95/98. Iexpress est un outil vraiment ancien qui est toujours fourni avec Windows - car les arguments n'acceptent que la commande et ses arguments.

Exemple d'utilisation:

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

2) SCHTASKS - Encore une fois, n'accepte que deux arguments - la commande et les arguments.Vérifie également s'il a démarré avec des autorisations élevées et si possible obtient le PID du processus avec WEVTUTIL (disponible à partir de Vista et au-dessus de sorte que la version la plus récente de Windows recevra le Commande 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éfinies via les options de ligne de commande. C'est un hybride jscript / batch et peut être appelé comme une batte.

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

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

4) «Win32_ProcessStartup» - encore une fois le wrapper complet et toutes les options sont accessibles via les arguments de la ligne de commande. non masqué certaines options comme 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, imprimez l'aide avec '-h'):

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

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

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

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

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

Le fichier batch pour démarrer cela 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 démarrés de cette manière s'exécutent 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 l'utilisation du net pour se connecter à un serveur distant.

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

wimh
la source
1
Intéressant, mais une exagération serrée pour ce scénario.
VonC
2

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 de Windows.

JosephStyons
la source
Possible, mais pas exactement ce que je
cherche
0

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 
Vinod Chelladurai
la source
0

Vous pouvez également utiliser

start /MIN notepad.exe

PS: Malheureusement, l'état de la fenêtre minimisée dépend de la commande à exécuter. VG ne fonctionne pas

start /MIN calc.exe
user2928048
la source