Запустить шаблон из другого шаблона.

Blackvil

Client
Регистрация
11.06.2021
Сообщения
57
Благодарностей
9
Баллы
8
Здравствуйте. Подскажите пожалуйста, как это сделать без bat файла?


ZennoPoster.AddTries(name,1); - не совсем подходит, так как изначально все шаблоны находится в остановленном состоянии. Этот метод просто добавляет попытки, но не запускает сам шаблон
 
  • Спасибо
Реакции: Sho

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
Здравствуйте. Подскажите пожалуйста, как это сделать без bat файла?


ZennoPoster.AddTries(name,1); - не совсем подходит, так как изначально все шаблоны находится в остановленном состоянии. Этот метод просто добавляет попытки, но не запускает сам шаблон
Вот так:
Запустить задачу и Остановить задачу:
string name = "";
ZennoPoster.StartTask(name);
ZennoPoster.StopTask(name);
Либо можно с помощью id:
97790


upd: Но почему-то может не работать с name. Вот ссылка на метод.
upd1: Точно работает в Guid.
 
Последнее редактирование:

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
Сделал решение, чтобы можно использовать имя шаблона и не искать его guid.
Заметил интересную особенность: бывают два разных guid на одно имя шаблона. Поэтому запускаю сразу два или останавливаю сразу два.

:dm: Буду благодарен, если комьюнити поддержит кнопкой "спасибо". :ay:
Так же будут признателен, если будите делиться ссылочкой на это сообщение при будущих вопросах/ответах.


Для начала нужно добавить в using'и две строчки:
gif ↓ кликабельна
Заполнить using.gif

Using:
using System.Xml;
using ZennoLab.InterfacesLibrary.Enums.Log;
и
Добавить в GAC:
1664043200292.png
1. Вводим для поиска "xml"
2. Выбираем System.Xml.dll
3. Жмем "OK"

Кубик C#:
Пример как Запустить или Остановить задачу на основе имени шаблона:
//string name = "ZennoLabAlerts";
string name = project.Variables["nameProject"].Value; // из переменной ZM

// *ПРИМЕР* Запустить шаблон с именем *Раскомментировать кусок если нужен запуск*
//foreach (KeyValuePair<Guid, string> pair in GetDictionaryTasksForZennoPoster(ZennoPoster.TasksList).Where(keyValuePair => name == keyValuePair.Value))
//{
//    project.SendToLog($"Задача найдена: {pair.Key}:::{pair.Value}", LogType.Info, true, LogColor.Green);
//    Guid id = pair.Key;
//    ZennoPoster.StartTask(id); // запуск задачи
//}

// *ПРИМЕР* Остановить шаблон с именем *Раскомментировать кусок если нужен остановка*
//foreach (KeyValuePair<Guid, string> pair in GetDictionaryTasksForZennoPoster(ZennoPoster.TasksList).Where(keyValuePair => name == keyValuePair.Value))
//{
//    project.SendToLog($"Задача найдена: {pair.Key}:::{pair.Value}", LogType.Info, true, LogColor.Green);
//    ZennoPoster.StopTask(pair.Key);  // остановить задачу
//}

// получить словарь с guid и именами шаблонов
Dictionary<Guid, string> GetDictionaryTasksForZennoPoster(IEnumerable<string> zennoTasksList)
{
    Dictionary<Guid, string> tasksDictionary = new Dictionary<Guid, string>();
    List<string> tasksList = new List<string>(zennoTasksList);
    if (tasksList.Count == 0)
        throw new Exception("Нет задач в ZennoPoster");

    foreach (string zennoTask in tasksList)
    {
        string xpathGetId = "Task/Id";
        string xpathGetNameTask = "Task/Name";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml($"<Task>{zennoTask}</Task>");
        string idTask;
        string nameTask;

        // Получить id задачи
        XmlNode nodeIdTask = doc.SelectSingleNode(xpathGetId);
        if (nodeIdTask != null)
            idTask = nodeIdTask.InnerXml;
        else
            throw new InvalidDataException($"{xpathGetId} не найден");

        // Получить name задачи
        XmlNode nodeNameTask = doc.SelectSingleNode(xpathGetNameTask);
        if (nodeNameTask != null)
            nameTask = nodeNameTask.InnerXml;
        else
            throw new InvalidDataException($"{xpathGetNameTask} не найден");

        // Записать в словарь
        if (Guid.TryParse(idTask, out Guid id))
        {
            project.SendInfoToLog($"✅ {idTask}:::{nameTask}", false);
            tasksDictionary.Add(id, nameTask);
        }
        else
            throw new FormatException($"Не удалось получить guid {idTask}\nИмя шаблона: {nameTask}");
    }

    return tasksDictionary;
}
upd: мелкие правки.

Если будут вопросы, пишите, вся информация есть в подписи.
Ниже приложил шаблон для примера ↓
 

Вложения

Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
нифига не понял для чего искать по имени... если можно запустить по имени :bk:

во всех проектах работает уже года 2 как и ни разу не было сбоя при управлении проектом.

97797
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
нифига не понял для чего искать по имени... если можно запустить по имени :bk:

во всех проектах работает уже года 2 как и ни разу не было сбоя при управлении проектом.

Посмотреть вложение 97797
Конечно, если было все так просто.)) Самый первый мой ответ ТС'у, тому подтверждение.

Возможно это баг в последней версии ZP (BuildID: 11790.19.09.2022). Так как у меня по имени не отрабатывало. Пишет "ок", но на этом все. Шаблон в ZP как работал, так и работает.
После того как я написал метод поиска, я обнаружил, что метод находит два Guid с одним именем шаблона.
Очень вероятно библиотечный метод (StopTask) берет первое совпадение name, но оно не влияет на работу ZP задачи.

Вот пример с одним именем, но c разными Guid:
97798
 
Последнее редактирование:
  • Спасибо
Реакции: Sho

Blackvil

Client
Регистрация
11.06.2021
Сообщения
57
Благодарностей
9
Баллы
8
Вот так:
Запустить задачу и Остановить задачу:
string name = "";
ZennoPoster.StartTask(name);
ZennoPoster.StopTask(name);
Либо можно с помощью id:
Посмотреть вложение 97790

upd: Но почему-то может не работать с name. Вот ссылка на метод.
upd1: Точно работает в Guid.
Большое спасибо!
 
  • Спасибо
Реакции: djaga

nik-n

Client
Регистрация
05.11.2016
Сообщения
242
Благодарностей
20
Баллы
18
Сделал решение, чтобы можно использовать имя шаблона и не искать его guid.
Заметил интересную особенность: бывают два разных guid на одно имя шаблона. Поэтому запускаю сразу два или останавливаю сразу два.

:dm: Буду благодарен, если комьюнити поддержит кнопкой "спасибо". :ay:
Так же будут признателен, если будите делиться ссылочкой на это сообщение при будущих вопросах/ответах.


Для начала нужно добавить в using'и две строчки:
gif ↓ кликабельна
Посмотреть вложение 97794
Using:
using System.Xml;
using ZennoLab.InterfacesLibrary.Enums.Log;
и
Добавить в GAC:
Посмотреть вложение 97799
1. Вводим для поиска "xml"
2. Выбираем System.Xml.dll
3. Жмем "OK"

Кубик C#:
Пример как Запустить или Остановить задачу на основе имени шаблона:
//string name = "ZennoLabAlerts";
string name = project.Variables["nameProject"].Value; // из переменной ZM

// *ПРИМЕР* Запустить шаблон с именем *Раскомментировать кусок если нужен запуск*
//foreach (KeyValuePair<Guid, string> pair in GetDictionaryTasksForZennoPoster(ZennoPoster.TasksList).Where(keyValuePair => name == keyValuePair.Value))
//{
//    project.SendToLog($"Задача найдена: {pair.Key}:::{pair.Value}", LogType.Info, true, LogColor.Green);
//    Guid id = pair.Key;
//    ZennoPoster.StartTask(id); // запуск задачи
//}

// *ПРИМЕР* Остановить шаблон с именем *Раскомментировать кусок если нужен остановка*
//foreach (KeyValuePair<Guid, string> pair in GetDictionaryTasksForZennoPoster(ZennoPoster.TasksList).Where(keyValuePair => name == keyValuePair.Value))
//{
//    project.SendToLog($"Задача найдена: {pair.Key}:::{pair.Value}", LogType.Info, true, LogColor.Green);
//    ZennoPoster.StopTask(pair.Key);  // остановить задачу
//}

// получить словарь с guid и именами шаблонов
Dictionary<Guid, string> GetDictionaryTasksForZennoPoster(IEnumerable<string> zennoTasksList)
{
    Dictionary<Guid, string> tasksDictionary = new Dictionary<Guid, string>();
    List<string> tasksList = new List<string>(zennoTasksList);
    if (tasksList.Count == 0)
        throw new Exception("Нет задач в ZennoPoster");

    foreach (string zennoTask in tasksList)
    {
        string xpathGetId = "Task/Id";
        string xpathGetNameTask = "Task/Name";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml($"<Task>{zennoTask}</Task>");
        string idTask;
        string nameTask;

        // Получить id задачи
        XmlNode nodeIdTask = doc.SelectSingleNode(xpathGetId);
        if (nodeIdTask != null)
            idTask = nodeIdTask.InnerXml;
        else
            throw new InvalidDataException($"{xpathGetId} не найден");

        // Получить name задачи
        XmlNode nodeNameTask = doc.SelectSingleNode(xpathGetNameTask);
        if (nodeNameTask != null)
            nameTask = nodeNameTask.InnerXml;
        else
            throw new InvalidDataException($"{xpathGetNameTask} не найден");

        // Записать в словарь
        if (Guid.TryParse(idTask, out Guid id))
        {
            project.SendInfoToLog($"✅ {idTask}:::{nameTask}", false);
            tasksDictionary.Add(id, nameTask);
        }
        else
            throw new FormatException($"Не удалось получить guid {idTask}\nИмя шаблона: {nameTask}");
    }

    return tasksDictionary;
}
upd: мелкие правки.

Если будут вопросы, пишите, вся информация есть в подписи.
Ниже приложил шаблон для примера ↓
а можно как то это все в OwnCode запихать?
чтобы в итоге оставалось только функцию использовать на подобии:
C#:
OwnCode.StartTask("ИМЯ_ТАСКИ");
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)