web-dev-qa-db-fra.com

Comment puis-je exécuter un fichier batch Windows mais masquer la fenêtre de commande?

Comment puis-je exécuter un fichier batch Windows mais en masquant la fenêtre de commande? Je ne veux pas que cmd.exe soit visible à l'écran lorsque le fichier est en cours d'exécution. Est-ce possible?

30
barfoon

Si vous écrivez un programme non géré et utilisez CreateProcess API, vous devez initialiser le paramètre lpStartupInfo du type - STARTUPINFO pour que le champ wShowWindow de la structure soit SW_HIDE et n'oubliez pas d'utiliser l'indicateur STARTF_USESHOWWINDOW dans le champ dwFlags de STARTUPINFO . Une autre méthode consiste à utiliser CREATE_NO_WINDOW indicateur du paramètre dwCreationFlags. La même astuce fonctionne également avec les fonctions ShellExecute et ShellExecuteEx .

Si vous écrivez une application gérée , vous devez suivre les conseils de http://blogs.msdn.com/b/jmstall/archive/2006 /09/28/createnowindow.aspx : initialisez ProcessStartInfo avec CreateNoWindow = true Et UseShellExecute = false, Puis utilisez comme paramètre de. Exactement comme dans le cas de vous pouvez définir la propriété WindowStyle de ProcessStartInfo sur ProcessWindowStyle.Hidden À la place ou avec CreateNoWindow = true.

Vous pouvez utiliser un script VBS que vous commencez par wcsript.exe. Dans le script, vous pouvez utiliser CreateObject("WScript.Shell") puis Exécuter avec 0 comme deuxième paramètre (intWindowStyle). Voir http://www.robvanderwoude.com/files/runnhide_vbs.txt comme exemple. Je peux continuer avec Kix, PowerShell et ainsi de suite.

Si vous ne voulez écrire aucun programme, vous pouvez utiliser tout utilitaire existant comme CMDOW/RUN/HID "c:\SomeDir\MyBatch.cmd " , hstart/NOWINDOW/D = c:\scripts" c:\scripts\mybatch.bat " , hstart/NOCONSOLE" batch_file_1.bat " = qui font exactement la même chose. Je suis sûr que vous trouverez beaucoup plus ce genre d'utilitaires gratuits.

Dans certains scénarios (par exemple à partir du chemin UNC), il est important de définir également un répertoire de travail pour certains locaux chemin (%SystemRoot%\system32 fonctionne toujours). Cela peut être important pour l'utilisation de l'une des variantes répertoriées ci-dessus de démarrage du lot masqué.

39
Oleg

En utilisant C #, il est très facile de démarrer une commande batch sans avoir de fenêtre ouverte. Jetez un œil à l'exemple de code suivant:

        Process process = new Process();
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.FileName = "doSomeBatch.bat";
        process.Start();
8
BitKFu

Pour tout fichier exécutable, vous pouvez exécuter votre programme en utilisant cmd avec le paramètre "c":

cmd /c "your program address"\"YourFileName".bat  

(-> si c'est un fichier batch!) En guise de solution finale, je vous suggère de créer un fichier .cmd et d'y mettre cette commande:

cmd /c "your program address"\"YourFileName".bat
exit

Il suffit maintenant d'exécuter ce fichier .cmd.

5
rain

Ici J'ai compilé toutes les façons que je connais pour démarrer un processus caché avec batch sans outils externes. Avec un prêt à utiliser des scripts (certains riches en options) et tous forment une ligne de commande.Où il est également possible que le PID soit renvoyé.Les outils utilisés sont IEXPRESS, SCHTASKS, WScript.Shell, Win32_Process et JScript.Net - mais tous sont encapsulés dans un .bat des dossiers.

4
npocmaka

Ce petit VBScript de technet fait l'affaire:

Const HIDDEN_WINDOW = 12

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objStartup = objWMIService.Get("Win32_ProcessStartup")

Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = HIDDEN_WINDOW
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
errReturn = objProcess.Create("mybatch.bat", null, objConfig, intProcessID)

Modifier mybatch.bat à votre nom de fichier bat, enregistrez-le en tant que vbs, exécutez-le.

Doc dit que ce n'est pas testé dans Win7, mais je viens de le tester, cela fonctionne bien. N'affichera aucune fenêtre pour le processus que vous exécutez

2
badbod99

Version codée native C++ de la réponse d'Oleg - ceci est copié/collé de n projet sur lequel je travaille sous la licence du logiciel Boost.

BOOL noError;
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInformation;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = SW_HIDE;
noError = CreateProcess(
    NULL,                                           //lpApplicationName
    //Okay the const_cast is bad -- this code was written a while ago.
    //should probably be &commandLine[0] instead. Oh, and commandLine is
    //a std::wstring
    const_cast<LPWSTR>(commandLine.c_str()),        //lpCommandLine
    NULL,                                           //lpProcessAttributes
    NULL,                                           //lpThreadAttributes
    FALSE,                                          //bInheritHandles
    CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT,  //dwCreationFlags
    //This is for passing in a custom environment block -- you can probably
    //just use NULL here.
    options.e ? environment : NULL,                 //lpEnvironment
    NULL,                                           //lpCurrentDirectory
    &startupInfo,                                   //lpStartupInfo
    &processInformation                             //lpProcessInformation
);

if(!noError)
{
    return GetLastError();
}

DWORD exitCode = 0;

if (options.w) //Wait
{
    WaitForSingleObject(processInformation.hProcess, INFINITE);
    if (GetExitCodeProcess(processInformation.hProcess, &exitCode) == 0)
    {
        exitCode = (DWORD)-1;
    }
}

CloseHandle( processInformation.hProcess );
CloseHandle( processInformation.hThread );
2
Billy ONeal

Vous pouvez écrire un service Windows qui ne fait qu'exécuter votre fichier batch. Étant donné que les services s'exécutent dans leur propre session de bureau, la fenêtre de commande ne sera pas visible par l'utilisateur.

0
Chris O

Utilisez Bat To Exe Converter et compilez le fichier Bat en tant qu'exécutable.

Pas:

  1. Open Bat to Exe Converter
  2. Sélectionnez votre fichier Bat
  3. Dans les options, sélectionnez "Application invisible"
  4. Terminez en appuyant sur le bouton de compilation
0
u01jmg3

Créez un raccourci vers votre fichier bat en utilisant le right-click et en sélectionnant Create shortcut. Right-click sur le raccourci que vous avez créé et cliquez sur propriétés. Cliquez sur la liste déroulante Exécuter et sélectionnez Réduit.

0
Papa Dilbert