#xpath #windows-task-scheduler
Вопрос:
Я создаю пользовательский фильтр событий для запуска задачи из планировщика задач Windows. Мне нужно выбрать свое событие, только если оно произойдет до x
часа дня.
Вот та часть XML-файла событий, которая меня волнует:
lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt; lt;Systemgt; lt;Provider Name="acvpnagent" /gt; lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt; lt;TimeCreated SystemTime="2021-11-01T04:24:49.6333217Z" /gt; lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt; lt;/Systemgt; lt;/Eventgt;
До сих пор у меня есть следующий XPath, но в нем отсутствует ограничение по времени:
lt;QueryListgt; lt;Query Id="0" Path="Cisco AnyConnect Secure Mobility Client"gt; lt;Select Path="Cisco AnyConnect Secure Mobility Client"gt;*[System[Provider[@Name='acvpnagent'] and (EventID=2039)lt;/Selectgt; lt;/Querygt; lt;/QueryListgt;
Можно ли добавить условие для TimeCreated
удовлетворения моего ограничения? И я все еще ограничен XPath 1.0 в Windows 10?
Ответ №1:
Это выражение XPath 1.0 будет выбирать Event
узлы следующим образом
//x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000]
Этот XPath будет выбирать узлы в соответствии с критериями, приведенными в примере операции
//x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039]
В то время как эта часть XPath добавит фильтр по времени суток
number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000
Обработка дат
Учитывая ISO-8601
дату как 2021-11-01T04:24:49.6333217Z
, это вернет часть HH:mm:ss
substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),".")
Результат: 04:24:49
Давайте уберем точки с запятой:
translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")
Результат: 042449
Наконец, сделайте это число и сравните с желаемым пределом
number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000
Учитывая этот пример XML
lt;rootgt; lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt; lt;Systemgt; lt;Provider Name="acvpnagent" /gt; lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt; lt;TimeCreated SystemTime="2021-11-01T04:24:49.6333217Z" /gt; lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt; lt;/Systemgt; lt;/Eventgt; lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt; lt;Systemgt; lt;Provider Name="acvpnagent" /gt; lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt; lt;TimeCreated SystemTime="2021-11-01T08:24:49.6333217Z" /gt; lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt; lt;/Systemgt; lt;/Eventgt; lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt; lt;Systemgt; lt;Provider Name="acvpnagent" /gt; lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt; lt;TimeCreated SystemTime="2021-11-01T11:24:49.6333217Z" /gt; lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt; lt;/Systemgt; lt;/Eventgt; lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt; lt;Systemgt; lt;Provider Name="acvpnagent" /gt; lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt; lt;TimeCreated SystemTime="2021-11-01T22:24:49.6333217Z" /gt; lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt; lt;/Systemgt; lt;/Eventgt; lt;/rootgt;
Найдите события, соответствующие критериям и произошедшие до 11:00:00, используя этот XPath
//x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000]
Результат:
echo -e 'setns x=http://schemas.microsoft.com/win/2004/08/events/eventncat //x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000]' | xmllint --shell tmp.xml / gt; setns x=http://schemas.microsoft.com/win/2004/08/events/event / gt; cat //x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000] ------- lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt; lt;Systemgt; lt;Provider Name="acvpnagent"/gt; lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt; lt;TimeCreated SystemTime="2021-11-01T04:24:49.6333217Z"/gt; lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt; lt;/Systemgt; lt;/Eventgt; ------- lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt; lt;Systemgt; lt;Provider Name="acvpnagent"/gt; lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt; lt;TimeCreated SystemTime="2021-11-01T08:24:49.6333217Z"/gt; lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt; lt;/Systemgt; lt;/Eventgt; / gt;
Если для сравнения используется полная дата, это будет выражение XPath
//x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(./x:System/x:TimeCreated/@SystemTime,"."),"T:-","")) lt; 20211101110000]
Примечание 1. выражения начинаются с ./
, чтобы выполнить оценку в текущем контексте узла.
Примечание 2: У меня нет Windows для тестирования, но XPath 1.0 в основном не зависит от языка/ОС, поэтому он должен работать. Оператору потребуется добавить обработку пространства имен в свою реализацию или удалить x:
префикс пространства имен из выражений в этом ответе.