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?
Réponses
Trop de publicités?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.
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();
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.
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 );
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