Выполнение команд из задачи C # - PullRequest
2 голосов
/ 06 мая 2011

Я создал небольшой инструмент C # для мониторинга sidebar.exe (как некоторые знают, в нем есть странная утечка памяти, поэтому этот монитор перезапускает процесс sidebar.exe, когда он достигает предела ...).

До этого у меня был файл .bat, и я запускал его вручную, и он работал нормально.Сейчас я выполняю команды cmd из C #, но поведение отличается: только 4 из 7 гаджетов снова появляются после «start sidebar.exe».Это всегда происходит с программой, и никогда при ручном запуске.

Какая разница в запуске команд как .bat или из процесса?И можно ли это исправить?

Я также пытался запустить сам .bat из процесса, та же проблема ...

Команды:

taskkill /im sidebar.exe /f

TIMEOUT /T 2 в .bat или System.Threading.Thread.Sleep(2000); в программе

start sidebar.exe

Обновление: код того, что я пробовал:
Вариант 1 - запустить .bat:System.Diagnostics.Process.Start(@"C:\....restart.bat");
Опция 2 - команды запуска:
...
this.executeCmd("taskkill /im sidebar.exe /f");
System.Threading.Thread.Sleep(2000);
this.executeCmd("start sidebar.exe");
...

private void executeCmd(String command)
    {
        ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
        psi.RedirectStandardOutput = true;
        psi.UseShellExecute = false;
        psi.CreateNoWindow = true;
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo = psi;
        proc.Start();
        string result = proc.StandardOutput.ReadToEnd();
        System.Console.Out.WriteLine(result);
    }

Обновление:
Мне сказали, что это проблема с правами доступа / учетной записью / пользователем, я пытался решить ее безуспешно, но заметил, что в Java этого не происходит, поэтому я объединил Java и C # для этого инструмента (java runnable вызывается при запуске, используя небольшой exe, который возвращает использование sidebar.exe) - работает отлично.Тем не менее, я был бы признателен за ответ, если кто-нибудь знает об этой проблеме C #.

1 Ответ

0 голосов
/ 06 мая 2011

Я считаю, что ваша проблема в среде, в которой вы работаете. Дополнительная информация полезна, но здесь есть что попробовать.

используя пространство имен System.Diagnostics, создайте объект ProcessStartInfo, предоставьте соответствующую информацию и особенно убедитесь, что указано имя пользователя вошедшего в систему пользователя.

использовать этот объект ProcessStartInfo в качестве параметра для вызова Process.Start (ProcessStartInfo).

Это должно запустить процесс под соответствующей учетной записью пользователя.

Теперь, если вы используете это как службу, у вас могут возникнуть дополнительные проблемы, так как службы не имеют доступа к графическому интерфейсу, так как службы разработки не предназначены для ввода данных пользователем, поэтому среда может быть ограничена и Возможно, боковая панель не сможет найти сохраненные настройки.

знал, что я должен был нажать "Обновить", прежде чем нажать "Отправить":)

...