Вот то, что я использую для выполнения пакетных файлов:
proc.StartInfo.FileName = target;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
proc.WaitForExit
(
(timeout <= 0)
? int.MaxValue : timeout * NO_MILLISECONDS_IN_A_SECOND *
NO_SECONDS_IN_A_MINUTE
);
errorMessage = proc.StandardError.ReadToEnd();
proc.WaitForExit();
outputMessage = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
я не знаю, добьется ли это цели для Вас, но у меня нет проблемы его зависанием.
pg_dump.exe, вероятно, запрашивает ввод данных пользователем. Эта база данных требует аутентификации? Вы полагаетесь на какие-либо ПЕРЕМЕННЫЕ СРЕДЫ, которые не будут присутствовать для сервиса? Я не знаю pg_dump, но каковы другие возможные причины, которые он запросил бы вход?
Что делает пакетный файл? Вы уверены, что процесс становится запущенным с достаточным количеством privs для выполнения пакетного файла? Сервисы могут быть ограничены в том, что им позволяют сделать.
Также удостоверяются, делаете ли Вы что-то как использование команды копии для перезаписи файла, как который Вы делаете что-то:
echo Y | copy foo.log c:\backup\
кроме того, удостоверьтесь, что Вы используете полные пути для пакетных команд, и т.д. Если пакетный файл запускает приложение для GUI в своего рода режиме "Console", который может быть проблемой также. Помните, сервисы не имеют "Рабочего стола" (если Вы не включаете, "взаимодействуют с рабочим столом") потянуть любой вид окон или окон сообщения к. В Вашей программе Вы могли бы хотеть открыть stdout и каналы stderr и чтение от них во время выполнения в случае, если Вы получаете любые сообщения об ошибках или что-либо.
WebServices, вероятно, выполняются как учетная запись IUSR или анонимная учетная запись, который когда-либо, так, чтобы могла бы быть проблема для Вас. Если это работает при выполнении его в консоли это - просто первый шаг. :)
я не вспоминаю если Система. Диагностика. доступны только в отладке или нет. Вероятно, не, но некоторые из них мог бы быть. Я должен буду выяснить это для Вас.
Hope это дает Вам некоторое представление.
Larry
Следующий шаг, который я сделал бы, должен разжечь отладчик и видеть, можно ли сказать то, на чем ожидает программа. Если Вы - expierenced при отладке в блоке, Вы можете понимать то, что происходит с помощью инструментов как ProcExp, FileMon, и т.д.
Являющийся, окна SERVICE и не веб-сервис, имеют довольно мало значения. Так или иначе Вы попробовали мое предложение установки, "Позволяют Сервису взаимодействовать с рабочим столом"?
, Если Вы являетесь отчаянными, Вы могли бы попытаться запустить cmd.exe вместо своего пакетного файла. Затем с помощью cmd параметров строки cmd.exe у Вас может быть IT, запускают пакетный файл. Это, вероятно, дало бы Вам окно подсказки cmd для просмотра эффективной выходной мощности при включении взаимодействования с рабочим столом.
Для полной справки на cmd.exe, просто введите cmd/? в любой командной строке.
Larry
Вот решение. Решение не ясно, потому что я изменил так многих время код, и теперь это работает!
я попытался использовать Учетную запись Пользователя, и это не то, что работало. Используйте LocalSystem. Вот код, которые выполняют, главным образом что Kevin дал мне.
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = fileName;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
proc.WaitForExit();
output1 = proc.StandardError.ReadToEnd();
proc.WaitForExit();
output2 = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
Спасибо всем, я-проголосую за всех и приму Kevin, так как он помогает мне с начала. Очень странный, потому что это работает теперь...
Daok, выглядит, как будто единственной вещью, которую Вы изменили, был период тайм-аута на начальном WaitForExit (). Необходимо ОЧЕНЬ остерегаться этого. Если что-то ДЕЛАЕТ , подвешивают Ваш сервис, он никогда не будет возвращаться (и хорошо, в значительной степени работать как он, был для Вас к настоящему времени.. heh), но это не будет хорошо для конечных пользователей...
Теперь, возможно, что Вы знаете то, что заставляет это зависать, можно отладить его далее и найти полное решение...
, Что, или кружат это в некотором потоке, который можно контролировать, и уничтожают, если он зависает слишком долго.
Просто моя ценность за 2 цента, которая обычно не является много. ;)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace VG
{
class VGe
{
[STAThread]
static void Main(string[] args)
{
Process proc = null;
try
{
string targetDir = string.Format(@"D:\adapters\setup");//this is where mybatch.bat lies
proc = new Process();
proc.StartInfo.WorkingDirectory = targetDir;
proc.StartInfo.FileName = "mybatch.bat";
proc.StartInfo.Arguments = string.Format("10");//this is argument
proc.StartInfo.CreateNoWindow = false;
proc.Start();
proc.WaitForExit();
}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred :{0},{1}", ex.Message,ex.StackTrace.ToString());
}
}
}
}