XML планировщика задач Windows

Автор MWW_Ruza, 23 сентября 2024, 15:25

« назад - далее »

MWW_Ruza

Добрый день!
Делаю управление некой задачей из планировщика винды...
Но, лазить в нем интерактивно - вломммм....
Поэтому решил из 1С из настроек создавать, запускать и вообще "рулить" этой задачей.
Для этого, есть утилита коммандной строки "SCHTASKS". В принципе, это не само по себе, а просто интерфейс коммандной строки, который рулит планировщиком. Сам планировщик - он один.
Сделал. Все работает идеально.
Но, есть некоторые параметры, которые не доступны через "SCHTASKS", и можно их настроить только интерактивно.
Ну, или применить "импорт" задания из XML через ту-же утилиту "SCHTASKS".
Саму XML можно экспортировать из планировщика.
Это все хорошо, но, решил, что буду создавать ее на ходу, прямо в 1С, через XML_DOM.
Но, созданная XML не грузится - ошибка структуры.
Стал разбираться, оказывается, при создании XML из 1С добавляется лишний атрибут, он-же пространство имен, к узлам первого уровня, хотя, в экспортированной, пространство имен есть только у корневого элемента, узлы первого уровня, идут совсем без атрибутов.
Попытка разобраться с МС парсером и DOM ни к чему не привела - упорно пишет этот атрибут, хоть что делай.
Везде советуют просто удалять лишнее из готового файла.
Прекрасно, но кодировка XML - utf-16.
Средствами работы с текстом 1С она корректно не читается.
В общем, через поток (АдобСтрим) и прочие извращения, победил это, частично... Правда только в utf-8 удалось сохранить... Но, планировщик ее глотает, единственное а начале файла нало указать, что это utf-16.
При попытке открыть ее на просмотр - кракозябры, вообще на китайские иероглифы похожие.

Как можно это побороть? Как-то не верно это, хоть и работает...
Да, кстати, никакой кирилицы в XML нет, все символы латиница и цифры... Какая ему разница до кодировки в таком случае?

Пояснение к картинкам.
Первая - экспортировано из планировщика. Подчеркнуты узлы, которые без атрибутов должны быть.
Вторая - как формирует 1С. Подчеркнуты лишние атрибуты.
Третья - после открытия в 1С и сохранения в utf-8, но с заголовком, что это, якобы utf-16. Такую "красоту", рисует конечно просмотрщик, так, как не понимает кодировку - в заголовке 16, внутри 8. Но, такую XML нормально переваривает планировщик :-) Если в блокноте поменять в заголовке 16 на 8 - то просмотрщик начинает открывать нормально, но планировщик говорит, что файл не верный.

trad

У тебя не получилось первую "картинку" получить средствами XML_DOM?

MWW_Ruza

Да. Именно так. Получается вторая, хоть убей...
У подчиненных корневому узлу узлов, упорно образуется лишний атрибут, как-бы унаследованный от корня. В таком виде планировщик ХМЛ не принимает, структура не нравится. Если убрать атрибуты вручную, в любом редакторе, то глотает нормально.
Делаю так, фрагмент кода:

   XML_DOM         = CreateObject("MSXML2.DOMDocument.6.0");
   XML_HELPER      = CreateObject("Msxml2.MXNamespaceManager.6.0");
   Header          = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-16""" );
   XML_DOM.appendChild(Header);
   XML_TASK      = XML_DOM.createNode(1,"Task",);
   XML_DOM.appendChild(XML_TASK);
   ДобавитьАттрибут(XML_DOM, XML_TASK, "version", "1.2");
   ДобавитьАттрибут(XML_DOM, XML_TASK, "xmlns", "http://schemas.microsoft.com/windows/2004/02/mit/task");
   
   XML_REGISTR      = XML_DOM.createNode(1,"RegistrationInfo",);
   XML_TASK.appendChild(XML_REGISTR);

XML_TASK- корень документа, у него атрибутом идет это пространство имен, добавляю его и версию.
XML_REGISTR - подчиненный ему узел. Никакие атрибуты ему не добавляю, он сам их "притягивает" (наследует) от родителя.
Дальше, узлы следующего уровня, подчиненные например XML_REGISTR - уже нормально, никаких атрибутов не подтягивают.

Если удалось-бы победить это, то и дальнейшая обработка и "выпиливание" лишнего из готовой ХМЛ была бы не нужна.

trad

//*******************************************
Функция ДатаВXML(пДата, пВремя = "") Экспорт

	лДатаСтрокой = Формат(пДата, "ДГГГГММДД");
	лРезультат = Сред(лДатаСтрокой, 1, 4) + "-" + Сред(лДатаСтрокой, 5, 2) + "-" + Сред(лДатаСтрокой, 7, 2);
	Если пВремя <> "" Тогда
		лРезультат = лРезультат + "T" + пВремя;
	КонецЕсли;	
	Возврат лРезультат;

КонецФункции

//*******************************************
Функция ДобавитьЭлемент(ДокXML, Родитель, ИмяЭлемента, Значение="") Экспорт
	
	Узел = ДокXML.createElement(ИмяЭлемента);
	Если Значение <> "" Тогда
		Узел.text = Строка(Значение);
	КонецЕсли;
	Возврат Родитель.appendChild(Узел);
	
КонецФункции

//*******************************************
Процедура Сформировать()

	ДокXML = СоздатьОбъект("Msxml2.DOMDocument");
	ДокXML.appendChild(ДокXML.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-16"""));
	
	Task = ДобавитьЭлемент(ДокXML, ДокXML, "Task");
	Task.setAttribute("version", "1.2");
	Task.setAttribute("xmlns", "http://schemas.microsoft.com/windows/2004/02/mit/task");
	
	RegistrationInfo = ДобавитьЭлемент(ДокXML, Task, "RegistrationInfo");
	ДобавитьЭлемент(ДокXML, RegistrationInfo, "Date", ДатаВXML(ТекущаяДата(), ТекущееВремя()));
	ДобавитьЭлемент(ДокXML, RegistrationInfo, "Author", "trad");
	
	Triggers = ДобавитьЭлемент(ДокXML, Task, "Triggers");
	TimeTrigger = ДобавитьЭлемент(ДокXML, Triggers, "TimeTrigger");
	Repetition = ДобавитьЭлемент(ДокXML, TimeTrigger, "Repetition");
	ДобавитьЭлемент(ДокXML, Repetition, "Interval", "PT1M");
	ДобавитьЭлемент(ДокXML, Repetition, "StopAtDurationEnd", "false");

	ДокXML.save(мПуть);
	
КонецПроцедуры

MWW_Ruza

Ага, так работает, спасибо!
То, "что доктор прописал" :-)
Сейчас буду разбираться, где накосячил :-)

trad

СоздатьОбъект("Msxml2.DOMDocument") -> OLE.IXMLDOMDocument2
СоздатьОбъект("MSXML2.DOMDocument.6.0") -> OLE.IXMLDOMDocument3

trad

DOMDocument3 чувствителен к пространствам имен. Поэтому тут нужно их указывать.

Вот ты указал NS для Task, а далее не указываешь. Парсер считает что RegistrationInfo и все вложенные уже в другом, пустом NS, поэтому и добавляет xmlns=""

Сделай так
ns = "http://schemas.microsoft.com/windows/2004/02/mit/task";
XML_DOM.createNode(1,"RegistrationInfo", ns);
// и для всех вложенных тоже

MWW_Ruza

Понятно, спасибо. Можно и так, это пришло в голову когда первое свое сообщение за сегодня сегодня перечитывал, переосмыслил написанное, но попробовать не успел.

Но, можно и по твоему - я у корневого узла добавлял атрибуты методом createAttribute, а надо методом setAttribute.
Переделал, это сразу помогло, лишние атрибуты у подчиненных узлов исчезли, у всех до конца файла.

MWW_Ruza

Хм... Еще и объект влияет, версия парсера:

Так - подставляет атрибуты лишние: XML_DOM = CreateObject("MSXML2.DOMDocument.6.0");

А так: XML_DOM = CreateObject("MSXML2.DOMDocument"); нет, все нормально.

Это как равз то, что в сообщениях #5 и #6, "проверил на практике", все так и есть :-)