Мне приходится запускать файл control.bat и файлы server.bat последовательно (кстати, на самом деле 5 файлов). Это мои стартовые программы для серверов ERP. По какой-то причине (например, обновления Windows перезагружают сервер). Я пытаюсь создать службу Windows, чтобы контролировать, работают ли control.bat и server.bat или нет. Если хотя бы один из них не работает. Он убьет все сеансы летучих мышей и перезапустит все с помощью C#. Я пробовал, как показано ниже.
Process[] processlist = Process.GetProcesses();
foreach (var item in processlist)
{
Process[] pname = Process.GetProcessesByName("control.bat");//there is no processname like control but cmd
if (pname.Length == 0)
{
this.killAll();
break;
}
}
Но когда я контролирую список процессов, нет ни control.bat, ни server.bat... Но cmd есть. Есть ли решение найти этот файл cmd, который запускается из control.bat, server.bat...





Вы не можете увидеть, работает ли конкретный пакетный файл таким образом — файл bat — это просто сценарий, который выполняется процессом cmd.exe.
Если вы инициируете bat-файл из кода, вы можете Сортировать сделать это, проверив, запущен ли процесс:
using System.Diagnostics;
Process proc = new Process();
proc.StartInfo.FileName = "control.bat";
if (proc.Start())
{
//All good!
}
else
{
//Oh no! it's not running!
}
И таким образом вы будете знать, что происходит.
Вы можете установить заголовок для окна командной строки с помощью этой команды
title My Running Batch
После установки уникального заголовка для командного окна легко определить, существует ли окно с таким заголовком.
var list = Process.GetProcesses()
.Where(p => p.MainWindowTitle == "My Running Batch");
if (list.Count() == 0)
....
Process[] processes = Process.GetProcesses().Where(p => p.MainWindowTitle.Contains("cmd.exe"));