35 votes

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?

41voto

Oleg Points 136406

Si vous écrivez un programme non managé et utiliser la fonction CreateProcess API, alors vous devez les initialiser lpStartupInfo paramètre de type STARTUPINFO de sorte qu' wShowWindow champ de la structure est SW_HIDE et ne pas oublier d'utiliser STARTF_USESHOWWINDOW drapeau dans l' dwFlags domaine de STARTUPINFO. Une autre méthode consiste à utiliser CREATE_NO_WINDOW drapeau de l' dwCreationFlags paramètre. La même astuce de travail également avec ShellExecute et ShellExecuteEx fonctions.

Si vous écrivez une application managée vous devriez suit les conseils de http://blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx: initialiser ProcessStartInfo avec CreateNoWindow = true et UseShellExecute = false et ensuite les utiliser comme paramètre . Exactement comme dans le cas de vous pouvez définir la propriété WindowStyle de ProcessStartInfo de ProcessWindowStyle.Hidden à la place ou avec d' CreateNoWindow = true.

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

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

Dans certains scénario (par exemple à partir de chemin d'accès UNC), il est important de définir également un répertoire de travail pour certains le chemin d'accès local (%SystemRoot%\system32 travail toujours). Cela peut être important pour l'utilisation de tout à partir de ci-dessus indiqué les variantes de départ cachés lot.

8voto

BitKFu Points 2326

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();
 

6voto

rain Points 113

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
 

Maintenant, exécutez simplement ce fichier .cmd.

3voto

Billy ONeal Points 50631

Version codée native C ++ de la réponse d'Oleg - il s'agit d'un copier / coller d' un 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 );
 

2voto

badbod99 Points 3588

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)
 

Modifiez mybatch.bat sur le nom de votre 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

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