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?
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é.
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
Il suffit maintenant d'exécuter ce fichier .cmd.
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.
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
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 );
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.
Utilisez Bat To Exe Converter et compilez le fichier Bat en tant qu'exécutable.
Pas:
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.