J'ai un processus démon que je lance sur ma machine toutes les heures et même si j'ai coché la case Hidden
, cela ne fonctionne pas.
Toutes les heures, la tâche est exécutée, mais la fenêtre de commande noire dans laquelle mon application de console .NET s'exécute est affichée. Cela reste visible jusqu'à la fin de la tâche, puis disparaît. C'est très énervant, car il apparaît et interrompt ce que je fais:
Je le veux vraiment caché, alors comment puis-je résoudre ce problème?
D'accord, après quelques recherches supplémentaires, j'ai trouvé cette réponse sur StackOverflow:
Pour configurer une tâche planifiée afin qu'elle s'exécute en arrière-plan, changez l'utilisateur qui exécute la tâche sur SYSTEM et rien ne s'affichera sur votre écran.
Un commentaire indique que cela donne tous les droits sur la tâche, ce qui peut être gênant, mais acceptable dans ce cas.
Mais quand même, que fait Hidden
, s'il ne le fait pas? Et pourquoi le compte utilisateur exécutant le programme aurait-il quelque chose à voir avec le fait qu'il soit visible?
Cochez la case "Exécuter si l'utilisateur est connecté ou non" et le fichier exécutable s'exécutera en arrière-plan.
Pourquoi la tâche planifiée de Windows 7 qui s'exécute est-elle masquée? devrait expliquer pourquoi cela se produit.
En outre, cette description TechNet de Propriétés de la tâche générale est la suivante:
Les propriétés générales d'une tâche sont affichées dans l'onglet Général de la boîte de dialogue Propriétés de la tâche ou Créer une tâche. Les propriétés générales d'une tâche incluent le nom de la tâche, l'auteur, la description, les options de sécurité, le système d'exploitation pour lequel la tâche est configurée, et une propriété permettant de contrôler si la tâche est masquée . .
Lorsque vous créez une tâche dans un dossier de tâches, vous devez nommer la tâche. Deux tâches ne peuvent pas avoir le même nom si elles se trouvent dans le même dossier de tâches. La description de la tâche est facultative.
Les options de sécurité de la tâche spécifient le contexte de sécurité dans lequel la tâche est exécutée. Pour plus d'informations, voir Contexte de sécurité de la tâche.
Par défaut, les tâches masquées ne sont pas affichées dans l'interface utilisateur du planificateur de tâches. Vous pouvez afficher les tâches masquées lorsque l'option Afficher les tâches masquées est sélectionnée dans le menu Affichage. Vous faites une tâche masquée lorsque vous cliquez sur la case à cocher Masqué sous l'onglet Général de la boîte de dialogue Propriétés de la tâche ou Créer une tâche.
Cela ne signifie-t-il pas que la case à cocher ne masque que la tâche elle-même de l'interface utilisateur du planificateur, et non le programme réel planifié?
LA SOLUTION ULTIME
Si ce sont des pactes pour vous, la solution ultime consiste à créer un fichier de script JS semblable à celui ci-dessous, qui exécutera votre commande dans une fenêtre masquée, attendra que votre commande se termine et renvoie son code d'erreur:
WScript.CreateObject("WScript.Shell")
.Run('powershell -File C:\\Path\\To\\MyScript.ps1', 0,true);
Enregistrez-le dans un fichier js (myjob.js) et ajoutez-le à votre planificateur de tâches: Profitez
"Exécuter si l'utilisateur est connecté ou non" permettra à l'option masquée de fonctionner. Notez que vous devez fournir vos informations d'identification après avoir choisi cette option.
Tous les deux :
empêchera la fenêtre de commande noire, mais soyez conscient des inconvénients: vous ne pourrez pas travailler avec certains outils d'automatisation d'interface graphique tels que 'AutoIt' ou SendKeys dans PowerShell, car Windows lance les tâches dans un environnement sans style.
Je laisse les paramètres par défaut et écris de courts programmes personnalisés qui génèrent l'exécution sans afficher de fenêtre. Par exemple, pour exécuter un fichier de commandes sans afficher une fenêtre d'invite de commande, utilisez le code ci-dessous. Définissez la tâche pour générer "RunBatchFile.exe (path_to_batch_file)".
class Program
{
static void Main(string[] args)
{
try
{
if (args.Length < 1)
{
Console.WriteLine("No batch file");
Console.WriteLine("Usage: RunBatchFile (path)");
Environment.Exit(1);
}
if (!File.Exists(args[0]))
{
Console.WriteLine("Batch file {0} not found", args[0]);
Console.WriteLine("Usage: RunBatchFile (path)");
Environment.Exit(1);
}
// Set to batch file's folder
string startIn = Path.GetDirectoryName(args[0]);
if (!string.IsNullOrEmpty(startIn) && Directory.Exists(startIn))
Directory.SetCurrentDirectory(startIn);
// Start
ProcessStartInfo pi = new ProcessStartInfo()
{
FileName = args[0],
UseShellExecute = true,
WindowStyle = ProcessWindowStyle.Hidden
};
Process.Start(pi);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.ToString());
}
}
}
J'avais ce problème avec les tâches planifiées Powershell (que je déployais via GPO). J'ai fini par l'envelopper dans une fenêtre de commande:
CMD
/Q /D /C "powershell.exe -Command "& '\\MYDOMAIN\netlogon\MyPowerShellScript.ps1'""