Выполнить пользовательскую команду в C # Windows Service - PullRequest
0 голосов
/ 15 августа 2011

У меня есть пользовательская консольная команда, которая, если она выполняется в командной строке, просто отображает некоторый текст в командном окне (аналогично команде 'dir').

Я пытаюсь выполнить команду «myCommand» из службы Windows, и она всегда возвращает пустые строковые значения. Однако, если выполнить ту же команду в командной строке, результат отобразится в окне командной строки. Кроме того, если я запускаю приведенный ниже код в приложении Windows Form, он работает нормально, и я получаю те же данные, которые отображаются на экране команд, в строковую переменную.

Куда я иду не так? Почему код возвращает пустую строку, когда я выполняю ее из службы Windows, где она работает в приложении форм. Есть ли другой метод для захвата результата команды в строковую переменную в службе Windows? Пожалуйста, порекомендуйте. Спасибо.

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();

Ответы [ 3 ]

1 голос
/ 15 августа 2011

Вы не устанавливаете рабочий каталог (то есть procStartInfo.WorkingDirectory), поэтому, если система не может найти «myCommand», вы получите этот результат.

Даже если «myCommand» находится в том же каталогекак ваш exe-файл службы, который обычно не работает, поскольку рабочим каталогом службы обычно является windows \ system32.

1 голос
/ 15 августа 2011

Присоедините отладчик Visual Studio к запущенной службе (меню «Отладка», «Присоединить к процессу»), установите точку останова в коде, где вы выполняете команду, а затем выполните команду.Это позволит вам отладить проблему.При необходимости вы можете вызвать метод System.Diagnostics.Debugger.Break в вашей службе, чтобы заставить его проникнуть в отладчик в соответствующей точке, без необходимости сначала подключать отладчик.

Редактировать:

Я предлагаю вам также записать стандартный поток ошибок:

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

Проверьте, что вы получаете в строке ошибки.Я использую WaitForExit для ожидания выхода из команды тоже.

0 голосов
/ 19 июля 2016

Я предпочел это Более простой способ отладки C # Windows Service

Я добавил условное условие Если запустить отладчик из метода OnStart, а затем поставить точку останова в моем методе OnCustomCommand (int) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...