Comment puis-je exécuter un script batch dans un service windows en C#?
Je suis en train d'exécuter une .chauve-souris de script en C# windows service, mais il ne semble pas fonctionner.
Ainsi, le script que je suis en train d'exécuter, startup.bat
, à son tour, appelle un autre script, call catalina.bat ...
, qui à son tour s'exécute start java ...
Je peut exécuter de démarrage.chauve-souris à la main, mais je veux l'exécuter en tant que service Windows. Quand j'essaie de le faire en C# windows de l'application de service, rien ne semble se produire. Mon service Windows code ressemble à ceci:
public class MyService : ServiceBase
{
public static void Main(string[] args)
{
ServiceBase.Run(new MyService());
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
this.RunScript(@"bin\startup.bat");
Thread.Sleep(1000);
}
protected override void OnStop()
{
base.OnStop();
this.RunScript(@"bin\shutdown.bat");
Thread.Sleep(1000);
}
private void RunScript(string processFileName)
{
var startInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = "/C " + Path.Combine(@"C:\server", processFileName),
CreateNoWindow = true,
ErrorDialog = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
UseShellExecute = false,
WindowStyle = ProcessWindowStyle.Hidden
};
startInfo.EnvironmentVariables.Add("CATALINA_HOME", @"c:\server");
var process = new Process();
process.StartInfo = startInfo;
process.Start();
}
}
Je ne comprends pas pourquoi cela ne s'est pas exécuté. Ce que je fais mal?
Et oui, vous remarquerez peut-être que je suis en train de lancer Tomcat sous Windows en tant que service avec C#. Eh bien, je fais cela parce que je n'ai pas été en mesure d'utiliser tomcat7.exe pour diverses raisons, mais il est probablement mieux de ne pas se demander pourquoi je suis en train de faire de telles choses. Quelle que soit la raison, ce que je fais ici doivent aussi travailler, n'est-ce pas?
Mise à jour en réponse à Gabe de la suggestion:
Si j'ai mis UseShellExecute = vrai j'obtiens une exception:
System.InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to redirect IO streams.
at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
at MyService.RunScript(String processFileName)
J'ai donc mis en RedirectStandardError et RedirectStandardOutput à faux, ce qui donne cette erreur:
System.InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to use environment variables.
at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
at MyService.RunScript(String processFileName)
argh! Je me sens exaspérés!
- Je pense que vous avez besoin
UseShellExecute = true
pour que cela fonctionne. - Mise à jour avec ce qui se passe si j'essaie ce. Merci.
- En fait, j'ai mis à jour le démarrage.chauve-souris de sorte qu'il n'a pas besoin de la variable d'environnement. Toujours rien... 🙁
- Est-ce vraiment nécessaire de stdio de redirection?
- Je voulais dire que j'ai mis RedirectStandardOutput false après la mise UseShellExecute de vrai. J'ai aussi accepté les réponses à quelques vieilles questions... mieux maintenant?
Vous devez vous connecter pour publier un commentaire.
Exécuter "cmd.exe" et de passer "de démarrage.chauve-souris" comme argument.
/C startup.bat
IIRCPour fermer la boucle sur le présent, le problème a été en effet une autorisation de sécurité Windows questions.
La suggestion faite ici semblait résoudre mon problème.
Essayer paramètre "Autoriser le service à interagir avec le bureau" dans votre service de réglage.
Possible en double - Exécuter un fichier Batch dans le Service Windows lorsque vous êtes déconnecté
Si votre script fonctionne très bien comme un utilisateur interactif, mais pas comme un service, alors il ya un couple de évident causes possibles:
Ces suggestions sont essentiellement des suppositions, mais avec si peu d'information, il est difficile de faire mieux.
sc.exe create t1 binPath= my.exe DisplayName= myservice
pour installer le service par la voie.Essayer: