Exécuter un fichier batch de manière complètement cachée

139

Je cherche un moyen d'exécuter un fichier de commandes (.bat) sans que rien ne soit visible pour l'utilisateur (pas de fenêtre, pas de nom de barre des tâches, .etc ..).

Je ne veux pas utiliser un programme pour faire ça, je cherche quelque chose de plus propre. J'ai trouvé une solution qui utilise VBScript, mais je n'aime pas trop utiliser VBS.

Moayad Mardini
la source
Haha! Définitivement pas. Je développe un service Windows qui exécutera un fichier de commandes de temps en temps.
Moayad Mardini
4
Les services Windows ne fonctionnent pas en tant que fichiers de commandes. Ils fonctionnent comme des services. Vous devez clarifier la question - telle qu'elle est écrite et commentée, cela n'a aucun sens pour moi.
CarlF
1
J'ai un service Windows qui exécute des fichiers de commandes. Non pas que le service est un fichier de commandes.
Moayad Mardini
1
Dans quelle langue écrivez-vous votre service?
Hugh Allen
il y a hstart aussi.
Barlop

Réponses:

119

Solution 1:

Enregistrez cette ligne de texte sous forme de fichier invisible.vbs:

CreateObject ("Wscript.Shell"). Exécutez "" "" & WScript.Arguments (0) & "" "", 0, False

Pour exécuter n'importe quel programme ou fichier batch de manière invisible, utilisez-le comme ceci:

wscript.exe "C: \ Wherever \ invisible.vbs" "C: \ Un autre endroit \ MyBatchFile.bat"

Pour pouvoir également transmettre / relayer une liste d'arguments, utilisez uniquement deux guillemets doubles.

CreateObject ("Wscript.Shell"). Exécutez "" & WScript.Arguments (0) & "", 0, False

Exemple: Invisible.vbs "Kill.vbs ME.exe"

Solution 2:

Utilisez un outil de ligne de commande pour lancer un processus en mode silencieux : Quiet , hidecon ou hideexec .

harrymc
la source
2
Pourquoi 4 doubles guillemets, pourriez-vous s'il vous plaît expliquer?
Starx
Et si nous avions besoin de démarrer un programme caché?
Starx
5
@Starx VB syntaxe. &signifie concaténer des chaînes. Les chaînes sont entourées de guillemets doubles ( "). Les guillemets consécutifs ( "") à l'intérieur des délimiteurs de chaîne signifient un guillemet double ( "). Ainsi, quatre guillemets doubles ( """") seraient un littéral de chaîne d'un caractère, un guillemet double ( "). Rassemblez-le et """" & WScript.Arguments(0) & """"deviendrait "<argument>"<argument>est le premier argument de ligne de commande transmis au script.
Bob
4
Comment le modifier pour qu'il passe tous les arguments? Il serait plus pratique de passer les arguments sans les citer.
Ctrl-C
2
Cela ne vous oblige-t-il toujours pas à créer un fichier de commandes pour y insérer l' wscript.exe "C:\Wherever\invisible.vbs" ...intérieur?
endolith
26

Pour masquer des fichiers de commandes ou des fichiers de commandes ou des fichiers .... Utilisez l’ IExpress.exeutilitaire intégré de Windows XP pour générer un fichier .exe à partir du fichier de commandes. Lors de l'utilisation, IExpressassurez-vous de cocher l'option d'exécution cachée et de cocher toutes les cases pour ne rien montrer. Après avoir créé votre fichier .exe, placez-le dans le dossier de commande d'exécution que vous choisissez et vous ne le verrez jamais apparaître.

Paul Cheselske
la source
1
Oh, bonne solution en fait.
Camilo Martin
7
y at-il quelque chose d'équivalent à lexpress.exe dans les versions plus récentes de Windows, comme Windows 7?
dimanche
@ Sнаđошƒаӽ Il est dans Windows 7 .... vient de le tester
DarthRubik
@DarthRubik Merci de partager cela. Moi aussi j'ai testé et ça marche très bien. Il est temps d’invoquer la réponse. :)
Sнаошƒа
Cela ne semble pas fonctionner sous Windows 10 64 car le "Command.com" ne semble plus être présent
Arne S
10

use Cmdow est un utilitaire de ligne de commande Win32 pour NT4 / 2000 / XP / 2003 qui permet aux fenêtres d’être répertoriées, déplacées, redimensionnées, renommées, cachées / non masquées, désactivées / activées, réduites au minimum, agrandies, restaurées, activées / inactivées, fermées, tuées et supprimées. plus.

Exécuter un fichier de commandes caché en lui passant les paramètres: -

cmdow / run / caché mybat arg1 "arg 2"

Joe
la source
Mais comment pourrais-je exécuter cette commande?
Moayad Mardini
9
cmdow est détecté comme un malware par la plupart des produits antivirus. Par conséquent, il serait difficile d’utiliser cette solution ailleurs que dans votre propre PC.
Ganesh R.
@Ganesh: Une meilleure solution?
Moayad Mardini
Est-ce open source? Il n'y a aucun intérêt à utiliser une application tierce qui ne soit pas une source ouverte et qui pourrait être une solution de rechange pour les chevaux de Troie lorsque vous pourriez faire la même chose en exécutant vbscript d'Harrymc sur une ligne (voir la réponse en haut du fil).
thebunnyrules
1
Eh bien, il est open source, donc c'est vraiment génial. Vous pouvez obtenir le code source ici: github.com/ritchielawrence/cmdow
thebunnyrules
9

Si votre fichier de traitement par lot peut contenir une seule ligne et autant de caractères, utilisez simplement un raccourci en cliquant avec le bouton droit de la souris sur un dossier placé dans un répertoire aléatoire. Cliquez sur les propriétés et sous la cible, entrez ce que vous mettriez habituellement dans un fichier chauve-souris. Et Bobs ton oncle!

Avantages:

 No Command Window
 Ability to use an icon
 Same Functionality of bat file

Les inconvénients:

 Limited to one line, so many characters
Jack S
la source
Le seul problème est que vous ne pouvez pas associer un type de fichier à un raccourci. Donc, si vous voulez ouvrir un script avec un lot en double-cliquant dessus dans l'explorateur, vous avez toujours besoin d'un fichier .bat.
Björn Lindqvist le
J'essaie encore de trouver Oncle Bob, il est là où que ce soit !!
Pimp Juice IT
7

Exécutez le script via at at sans le rendre interactif:

at 11:00 script.bat

Une autre solution, si cela ne vous dérange pas d'installer quelque chose comme Python, vous pouvez simplement créer un script et l'exécuter avec pythonw(la version liée pour les opérations d'interface graphique). Puisque vous n'utilisez aucune API graphique, la fenêtre ne s'affichera pas. Utilisez simplement des appels à os.system()et cela imitera un script batch, car cela revient à taper les chaînes dans la ligne de commande.

Exemple:

import os

os.system("tasklist > C:\tasks.txt")
os.system("ipconfig /all > C:\netinfo.log")
John T
la source
3
Mais comment pourrais-je exécuter cette commande?
Moayad Mardini
Vous devez planifier une tâche planifiée ou écrire un service.
Unfundednut
exemples ajoutés.
John T
6

Vous pouvez l'exécuter facilement.

start /MIN batch.cmd
Brad Gilbert
la source
3
ou utilisez / B à la place!
Rany
6

Sous Windows 7, vous pouvez utiliser le panneau de configuration "Tâche planifiée" pour planifier l’exécution d’un fichier de commandes en arrière-plan de manière invisible avec les autorisations spécifiées et même en tant que compte "SYSTÈME". Voir la capture d'écran ci-dessous:

entrez la description de l'image ici

En outre, même si le nombre de fonctionnalités est réduit, vous pouvez également créer une tâche de script de traitement par lots invisible à partir de la ligne de commande à l'aide de la commande "AT.exe" sans l'option "/ interactive".

djangofan
la source
3
Une case à cocher masquée masque la tâche à l'interface utilisateur du planificateur de tâches (
Sourav Ghosh
Exécuter une tâche en tant que "SYSTÈME" lorsqu'il n'a pas besoin des privilèges "SYSTÈME" (et qu'il n'a pas fait l'objet d'une recherche minutieuse de faiblesses en matière de sécurité et qu'il n'a pas été renforcé) est une mauvaise idée. voir les commentaires ici .
Scott le
6

Je n'aime pas la solution VBScript.

Téléchargez et copiez nircmd.exe dans votre %systemroot%\system32dossier, puis ajoutez cette commande à la première ligne de votre lot:

nircmd.exe win hide ititle "cmd.exe"

ou personnalisez d'abord l'intitulé de votre lot avec la titlecommande suivante pour éviter de masquer toutes les cmdfenêtres, comme ceci:

title MyBatch
nircmd.exe win hide ititle "MyBatch"
BijaN-R
la source
J'utilise cette méthode exacte, mais j'ai échoué pendant un certain temps pour que nircmd ne masque pas la fenêtre cmd, elle est simplement réduite dans la barre des tâches et ne peut pas être restaurée en cliquant dessus. Je ne sais pas pourquoi ...
James Yang
3

Vous pouvez également créer un script AutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 
endolithe
la source
3

ENCORE, à partir de C / C ++, utilisez la fonction CreateProcess avec l'indicateur CREATE_NO_WINDOW. Il a beaucoup de puissance supplémentaire qui n'est pas montrée ici. C'est juste le minimum dont vous avez besoin pour remplacer system () ou la famille _spawn ().

STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);

PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );

// Spawn creates a cmd.exe window.  CreateProcess doesn't.
//if ( _spawnl( _P_WAIT, szFileNameBAT, szFileNameBAT, NULL ) ) {  
if ( !CreateProcess( szFileNameBAT, szFileNameBAT, NULL, NULL, false,
                     CREATE_NO_WINDOW, NULL, NULL, &si, &pi  ) ) {
  MyErrorFunc( "CreateProcess( \"%s\" ): %d", szFileNameBAT, GetLastError() );
  goto MyErrorHandling;
}

WaitForSingleObject( pi.hProcess, INFINITE );

CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
Frank suisse
la source
1
Bonne réponse pour l'approche WINAPI. Voici le code source et l'application en plus de votre réponse.
Alex
3

L’excellent Bat To Exe Converter convertira votre fichier .batou .cmdfichier en .exefichier.

Il a une interface utilisateur simple. Vous pouvez choisir de ne pas avoir de fenêtre de console en sélectionnant l'option «Application invisible». En outre, il vous permet d’affecter une icône, des fichiers associés au package et plusieurs autres options.

Voici une capture d'écran de la fenêtre principale de l'interface:


Notez que cette image est obsolète. Il présente la version 2.4.8 et, à compter de septembre 2018, le site Web propose la version 3.0.10.0 (dernière mise à jour le 2018-03-23).

Attention: le site Web www.f2ko.de est lié à coinhive.com, ce qui est largement identifié comme un malware .

BullyWiiPlaza
la source
2

Je l'ai fait avec succès avec nircmd de cette façon:

  1. téléchargez nircmd.exe à partir du lien
  2. créez votre fichier .bat
  3. la première ligne du fichier .bat doit être ceci: nircmd.exe win hide ititle "cmd.exe"
  4. sélectionnez les deux fichiers et créez un fichier auto-extractible à l'aide de winrar
  5. Dans l'onglet "Général", cochez la case "Créer un fichier à extraction automatique".
  6. dans l'onglet "avance" sélectionnez le bouton "extrait automatique"
  7. il y a une nouvelle fenêtre et sélectionnez l'onglet "mode" puis sélectionnez l'option: "tout masquer"
  8. sélectionnez l'onglet "mise à jour" et sélectionnez l'option "écraser les fichiers existants"
  9. Sélectionnez l'onglet "Général" et définissez un dossier de destination pour l'extraction si vous le souhaitez. Dans la zone "Exécuter après l'extraction", écrivez le chemin complet où votre fichier .bat sera extrait. Ex: si vous définissez le dossier d'extraction comme: "c: \ windows \", le chemin complet à exécuter après l'extraction sera: "c: \ windows \ fichier.bat" (dans le cas où votre .bat s'appelle: fichier.bat )
  10. cliquez sur accepter sur toutes les fenêtres

Maintenant, vous aurez un fichier .exe qui, après avoir cliqué dessus et l’installé, fera fonctionner votre .bat totalement caché.

ZEUS
la source
1
cmdow /run /hid "file.extention" arg1 "arg 2"
malak
la source
3
Veuillez inclure une brève explication de la commande. Cela pourrait aider l'OP (et les autres) à comprendre comment cela fonctionne au lieu de simplement copier la commande et de l'utiliser.
BloodPhilia
'cmdow' is not recognized as an internal or external command, operable program or batch file.
Bacco
1

Vous n'avez pas besoin de faire de spécial.

Si vous exécutez les fichiers de commandes à partir d'un service Windows, vous devez les masquer par défaut, sauf si vous activez l'option "Autoriser le service à interagir avec le Bureau" sur le service.

sgmoore
la source
1

En ajoutant ma réponse ici à partir d'un autre article puisqu'il s'agissait d'un doublon et que je ne vois pas cette solution ici, il existe maintenant 17 réponses différentes pour savoir comment exécuter un fichier de commandes masqué. Je supprimerai ma réponse sur ce message dans un avenir proche.

Créez votre script batch avec votre logique batch et vos commandes, puis créez un nouveau fichier avec une .VBSextension, utilisez la logique ci-dessous (exemple fourni ci-dessous) et branchez simplement le chemin complet vers votre fichier .CMDou .BATavec les PING -t <IPAddress>commandes, etc. il exécute le lot de manière cachée et n’affiche pas la fenêtre de commande lorsqu’il est exécuté.

Où la logique dans l'exemple ci-dessous spécifie de C:\Folder\BatchFileName.cmdchanger cela pour pointer vers le script batch avec vos commandes que vous exécutez manuellement, etc. maintenant.

Enregistrez le .VBSfichier et planifiez-le avec Task Scheduler Problèmes lors de la planification d'une tâche sur Windows7 afin qu'elle s'exécute selon un calendrier indéfini, adapté à vos besoins.

Sinon, il vous suffit de double-cliquer sur le .VBSfichier pour exécuter la PINGcommande infinie que vous avez insérée dans le fichier de commandes sur lequel vous le dirigez .

REMARQUE: Je crois que c'est ici que j'ai obtenu cette logique de script, mais il fonctionne de manière fiable dans le même but que vous avez ici: vous assurer que la fenêtre de commande est masquée lors de l'exécution d'un fichier de commandes. Source d'erreur serveur

EXEMPLE DE LIGNE DE COMMANDE D'EXÉCUTION DE SCRIPT VBS VISANT UNE FENÊTRE CMD

Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Folder\BatchFileName.cmd" & Chr(34), 0
Set WinScriptHost = Nothing
Pimp Juice IT
la source
1

Ici, j’ai compilé toutes les méthodes que je connais pour démarrer un processus caché avec batch sans outils externes.Avec un script prêt à l’emploi (dont certains sont assez riches en options), et tous forment une ligne de commande.Le Le PID est renvoyé. Les outils utilisés sont IEXPRESS, SCHTASKS, WScript.Shell, Win32_Process et JScript.Net.

npocmaka
la source
1

Malgré que j'ai déjà répondu à ceci, voici une autre approche. La différence est que le script batch peut se masquer lui-même lors de son exécution. Vous aurez cependant besoin de deux scripts supplémentaires - windowMode.bat et getCMDPid.bat (les deux contiennent du .netcode). Voici comment alors peut être utilisé:

@echo off
call getCmdPid
call windowMode -pid %errorlevel% -mode hidden

echo this should be written into log despite the cmd window is hidden>log
echo ending the log>>log
exit
npocmaka
la source
0

J'ai eu le même problème, mais j'ai compris:
Shell("filehere" & "parametersforbatchfilehere", vbHidden)

Alan Panayotov
la source
0

J'ai commencé à essayer de comprendre cela et je n'ai jamais vraiment réussi. C'était aussi proche que j'ai eu:

@echo off
if not defined PIL (
    set PIL=1
    start /min "" %~0
    exit /b
)
TITLE Hello World
echo Hello world!
pause>nul
djangofan
la source
0

J'avais besoin de cacher la fenêtre pour un fichier de commandes appelé à partir d'un menu contextuel de l'explorateur, mais aussi d'ajouter des guillemets sur le paramètre. Aucune des réponses n’ayant fonctionné pour moi, j’ajoute ma propre solution.

J'avais ceci sur la "commande" du registre pour un menu contextuel de l'explorateur:

cmd /c C:\mypath\myprogram.bat "%1"

Donc, pour le remplacer, je devais créer un vbs comme celui-ci:

WScript.CreateObject ("WScript.shell").run "cmd /c C:\mypath\myprogram.bat """ & WScript.Arguments(0) & """", 0, False

Enregistrez dans un endroit comme C:\mypath\myscript.vbset appelez-le comme ceci dans le registre:

wscript "C:\mypath\myscript.vbs" "%1"

Notez que le chemin d'accès .bat ne peut pas avoir d'espaces, remplacez-le donc par le nom de fichier 8.3. Donc, par exemple, C:\Program Files\myprogram.batdoivent être référencés comme C:\Progra~1\myprogram.bat. Pour voir le nom de fichier 8.3, utilisezdir /x

Bortao
la source
0

J'ai créé RunApp pour faire un tel travail et l'utiliser également dans mon environnement de production, j'espère que cela aidera.

La config comme ci-dessous:

fichier: config.arg

:style:hidden

MyBatchFile.bat
arg1
arg2

Et lance à la runapp.exeplace.

James Yang
la source
-1

Cela fonctionne pour Windows 8 (éventuellement d'autres)

  1. Créer un fichier batch comme d'habitude
  2. Créer un raccourci vers le fichier de commandes
  3. Clic droit sur le raccourci> propriétés
  4. Cliquez sur la disposition
  5. Décocher "Laisser la fenêtre de position du système"
  6. positionner à gauche tp -1000
  7. cliquez sur appliquer

  8. Cliquez sur le raccourci et il fonctionnera mais vous ne le verrez pas :)

Andrew
la source
4
Vraiment? Cela ne sera pas affiché sous forme de bouton dans la barre des tâches?
Scott