Ejecutar comando personalizado en C # Windows Service -- # campo con .net campo con windows-services camp Relacionados El problema

Run Custom Command in C# Windows Service


0
vote

problema

Español

Tengo un comando de consola personalizada, que, si se ejecuta en el símbolo del sistema, simplemente muestra algún texto en la ventana de comandos (similar al comando 'dir').

Estoy tratando de ejecutar el comando 'Mycommand' desde un servicio de Windows y siempre está devolviendo los valores de cadena en blanco. Sin embargo, si ejecuta el mismo comando en un símbolo del sistema, el resultado se muestra en la ventana de comandos. Además, si ejecuto el código de abajo en una aplicación Windows Forms, funciona bien y obtengo los mismos datos que se muestran en la pantalla de comandos en una variable de cadena.

¿Dónde estoy equivocado? ¿Por qué el código devuelve una cadena en blanco cuando lo ejecuto desde un servicio de Windows, donde funciona en una aplicación de formularios? ¿Hay algún otro método para capturar el resultado de un comando a una variable de cadena en un servicio de Windows? Por favor avise. Gracias.

  System.Diagnostics.ProcessStartInfo procStartInfo =      new System.Diagnostics.ProcessStartInfo("cmd", "/c myCommand"); procStartInfo.RedirectStandardOutput = true; procStartInfo.UseShellExecute = false; procStartInfo.CreateNoWindow = true;  System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo = procStartInfo; proc.Start(); string result = proc.StandardOutput.ReadToEnd();   
Original en ingles

I have a custom console command, which if executed in command prompt just displays some text in the command window (similar to 'dir' command).

I'm trying to execute the command 'myCommand' from a windows service and it is always returning blank string values. However, if run the same command in a command prompt, the result is displayed in the command window. Also, if I run the below code in a windows forms application, it works fine and I get the same data which is displayed in the command screen to a string variable.

Where am I going wrong? Why is the code returning a blank string when I execute it from a windows service, where as it works in a forms application. Is there any other method to capture the result of a command to a string variable in a windows service? Please advise. Thank you.

System.Diagnostics.ProcessStartInfo procStartInfo =      new System.Diagnostics.ProcessStartInfo("cmd", "/c myCommand"); procStartInfo.RedirectStandardOutput = true; procStartInfo.UseShellExecute = false; procStartInfo.CreateNoWindow = true;  System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo = procStartInfo; proc.Start(); string result = proc.StandardOutput.ReadToEnd(); 
        
         
         

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Adjunte el depurador de Visual Studio a su servicio de ejecución (menú de depuración, adjuntar al proceso), coloque un punto de interrupción en el código donde ejecute el comando, y luego ejecute el comando. Esto le permitirá depurar el problema. Si es necesario, puede llamar al System.diagnostics.debugger. Break método en su servicio para obligarlo a entrar en el depurador en el punto correspondiente, sin tener que adjuntar el depurador primero.

Editar:

Le sugiero que también capture el flujo de error estándar:

  procStartInfo.RedirectStandardError = true; ... string error = proc.StandardError.ReadToEnd();  proc.WaitForExit();   

Compruebe lo que obtiene en la cadena de error. Yo uso WAITFOREXIT para esperar hasta que el comando también salga.

 

Attach the Visual Studio debugger to your running service (Debug menu, Attach to Process), put a breakpoint in the code where you execute the the command, and then execute the comand. This will enable you to debug the problem. If necessary, you can call the System.Diagnostics.Debugger.Break method in your service to force it to break into the debugger at the appropriate point, without having to attach the debugger first.

Edit:

I suggest you also capture the standard error stream:

procStartInfo.RedirectStandardError = true; ... string error = proc.StandardError.ReadToEnd();  proc.WaitForExit(); 

Check what you get in the error string. I use WaitForExit to wait until the command exits too.

 
 
 
 
1
 
vote

No está configurando el directorio de trabajo (es decir, PROCSTARTINFO.WorkingDirectory), por lo que si el sistema no puede encontrar 'MyCommand', obtendrá este resultado.

Incluso si 'MyCommand' está en el mismo directorio que el archivo EXE de su servicio, que normalmente no funciona, ya que el directorio de trabajo para un servicio es normalmente Windows System32.

 

You are not setting the working Directory (ie procStartInfo.WorkingDirectory), so if the system can not find 'myCommand' , you will get this result.

Even if 'myCommand' is in the same directory as your service exe file, that does not normally work as the working directory for a service is normally windows\system32.

 
 
   
   
0
 
vote

Prefiero esto Manera más fácil de depurar un servicio C # Windows

Añadido el condicional si lanzará el depurador desde el método ONSTART, luego coloque un punto de interrupción en mi método OnCustomcommand (INT) .

 

I preferred this Easier way to debug a C# Windows Service

I added the conditional If to launch the debugger from the OnStart method, then put a breakpoint in my OnCustomCommand(int command) method.

 
 

Relacionados problema

0  Problema de cierre hace la PC de la red del servicio de Windows  ( Issue shutting does network pc from windows service ) 
Estoy tratando de apagar una computadora remota en mi red desde un servicio de C # Windows. Cuando ejecuto el código a continuación en una aplicación de prueb...

2  Sincronización automática de la base de datos  ( Automatic database synchronisation ) 
Estoy usando SQL Server 2008 y Visual Studio 2008 Tengo dos bases de datos. Necesito ejecutar una consulta en una base de datos y agarrar esos resultados y...

35  Usando Process.Start () para iniciar un proceso como un usuario diferente desde un servicio de Windows  ( Using process start to start a process as a different user from within a windo ) 
Me gustaría ejecutar periódicamente una EXE arbitraria .NET en una cuenta de usuario específica de un servicio de Windows. Hasta ahora tengo mi servicio de ...

10  Falló la instalación del servicio 'Tomcat 7'  ( Failed installing tomcat 7 service ) 
Intenté instalar Tomcat como un servicio con el archivo session.CreateCriteria<AddonStatus>() .Add(Restrictions.IdEq(key)) 18 en public class AddonStatus {...

0  Al consultar la clase Win32_NTLOGEGVENT de WMI con WQL, ¿la propiedad generanedada se basa en la hora local de la computadora o GMT?  ( When querying the win32 ntlogevent class from wmi with wql is the timegenerated ) 
Estoy escribiendo un servicio de C # Windows que está haciendo algo de batir a través del evento en algunos controladores de dominio. Algunos de ellos son Win...

5  Realizar una larga inicialización en el servicio de Windows  ( Perform lengthy initialization in windows service ) 
¿Cuál es la mejor manera de hacer una larga inicialización cuando un servicio de Windows se inicia (o se reanuda de la pausa) sin bloquear el administrador de...

1  ¿Por qué el servicio de servicio de Windows?  ( Why windows service crash ) 
Estoy usando VSTS 2008 + C # + .NET 3.5 para desarrollar una aplicación de servicio de Windows. El código es muy simple a continuación, y encuentro cuando Fil...

3  ¿Por qué el evento inscrito de este registro de un registro nunca disparó?  ( Why would this event logs entrywritten event never fire ) 
Tengo el siguiente código tanto en una aplicación C # Console y un servicio C # Windows. Funciona en la aplicación de la consola. Recoge el evento especificad...

5  Cómo realizar un seguimiento de si un proceso dado arroja excepción, utilizando el servicio de Windows en C #  ( How to track if a given process throws exception using windows service in c sha ) 
Mi proceso a veces lanza una excepción como Dllnotfound después de comenzar. Tengo un servicio de monitor responsable de mantener el estado constante del proc...

0  Escanear una carpeta y luego almacenar los resultados en un archivo o tabla de SQL C #  ( Scanning a folder then store the results in a file or sql table c sharp ) 
Lo que quiero es escanear una carpeta específica "C: PAGEFOLDER " y busque archivos .txt y busque actualizaciones cada n segundos. Luego coloque estos nombre...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos