А может есть какая-то возможность делать проверку, работает ли на данный момент другой шаблон?
Написал сниппет. У себя тестил, всё работает.
Возможно есть более изящные варианты решения данной задачи; в этом сниппете я слепил то, что когда-то встречал на форуме.
В Project Maker он работать отказывается, проверять в ZP. Перед запуском надо добавить в
Ссылки из GAC библиотеку
System.Xml (4.0.0).
Также до запуска сниппета в проекте должна существовать переменная с именем
project_name, в ней должно хранится имя шаблона, который будем проверять. Если в списке шаблонов не будет найден шаб с указанным именем, то будет выброшено исключение, т.е. экшн уйдёт по красной ветке.
Ещё надо создать переменную
timeout, в ней целочисленное значение - кол-во секунд, сколько будем ждать выполнения проверяемого шаблона. Если шаблон будет выполнятся дольше, чем указано в
timeout, будет выброшено исключение.
Возможно после того, как запускается шаблон через батник, стоит сделать небольшую задержку, т.к. он стартует не моментально и сниппет "успешно" завершиться т.к. у шаблона будет статус "Выполнен".
В случае успеха сниппет просто выйдет по зелёной ветке.
Лучше сначала аккуратно протестировать сниппет (сам я его тестил, но возможно чего-то не учёл), перед тем как кидать в бой
// Не забудь подключить System.Xml (4.0.0) в GAC
int timeout = Convert.ToInt32(project.Variables["timeout"].Value);
string project_name = project.Variables["project_name"].Value;
var checker = (Func<string, string>)((p_name) => {
System.Xml.XmlDocument target = null;
// Проверяем все проекты, которые добавлены в ЗП.
// Выходим как только находим первое полное совпадение имени.
foreach (var task in ZennoPoster.TasksList)
{
System.Xml.XmlDocument xml_doc = new System.Xml.XmlDocument();
xml_doc.LoadXml("<Task>" + task + "</Task>");
System.Xml.XmlNode xml_p_name = xml_doc.SelectSingleNode("Task/Name");
if (xml_p_name.InnerText == p_name)
{
target = xml_doc;
break;
}
}
if (target == null)
throw new Exception("Не удалось найти проект с именем `" + p_name + "`");
// string name = target.SelectSingleNode("Task/Name").InnerText;
string status = target.SelectSingleNode("Task/ExecutionSettings/Status").InnerText;
// project.SendInfoToLog(name, status, true);
return status;
});
bool is_project_active = true;
for (int i=0; i<timeout; i++)
{
string project_status = checker(project_name);
// Во время компиляции у проекта статус - WaitPerform
// Во время работы - Perform
if (!project_status.Contains("Perform"))
{
project.SendInfoToLog(String.Format("Шаблон {0} закончил работу", project_name), true);
is_project_active = false;
break;
}
Thread.Sleep(1000);
}
if (is_project_active)
throw new Exception(String.Format("[TimeoutError] Шаблон {0} не завершился после {1} секунд работы", project_name, timeout));