Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как проверить что выполняется выключение компьютера а не перезагрузка ? (http://forum.oszone.net/showthread.php?t=221936)

Реаниматор 01-12-2011 13:21 1807206

Как проверить что выполняется выключение компьютера а не перезагрузка ?
 
Редактор локальной групповой политики gpedit.msc
Конфигурация компьютера - Конфигурация Windows - Сценарии - Завершение работы

Мне надо перед выключением компьютера выполнить скрипт, как в скрипте определить что комп выключается а не перегружается ?

Реаниматор 01-12-2011 14:27 1807251

Как вариант Журнал событий "System-User32" Код события: 1074, Тип выключения: Выключение компьютера
Как в скрипте прочитать последнею запись из журнала и при сравнении Кода и Типа запустить скрипт ?

Kazun 01-12-2011 14:54 1807275

wevtutil qe system /c:1 /rd:true /q:"*[System[EventID=1074]]"

Реаниматор 02-12-2011 07:44 1807756

Оно и на перезагрузку тоже работает, мне надо только на выключение.

Я сделал так:
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent Where Logfile = 'System' and SourceName='User32'" _
& "and (EventCode = '1074' or EventCode = '1076')")

For Each objEvent in colLoggedEvents
If InStr(objEvent.Message, "Тип выключения: Выключение питания") > 0 Then

' Тут формируется имя файла, я копипастить не стал

NameFile = "Arc"
Set WshShell = CreateObject("Wscript.Shell")
WshShell.Run("c:\Progra~1\7-Zip\7z.exe a -mx7 -r0 -x!*.cdx D:\Archiv\DB_" & NameFile & ".7z d:\1C\DB", 1, True)
End If
Exit For
Next
Помогите избавиться от For, в запросе если делаю TOP 1 или Select 1, начинает ругаться на For, как сделать выборку из запроса на одну запись ?

Loran_rus 02-12-2011 08:23 1807766

Замените For на
Код:

Select Case testexpression
  [Case expressionlist-n
      [statements-n]] . . .
  [Case Else
      [elsestatements-n]]
End Select

или уберите не нужный Евент из (EventCode = '1074' or EventCode = '1076')

Реаниматор 02-12-2011 08:34 1807771

Цитата:

Цитата Loran_rus
или уберите не нужный Евент из (EventCode = '1074' or EventCode = '1076') »

Так они оба нужные, сложно скопипастить то что я написал и поменять ? Я не могу понять куда вставить Select Case testexpression

DmitriiV 02-12-2011 09:52 1807815

Цитата:

Цитата Реаниматор
... Помогите избавиться от For...»

Это невозможно. В противном случае Вы не сможете обращаться к экземплярам коллекции.

Цитата:

Цитата Реаниматор
... как сделать выборку из запроса на одну запись ?»

Как именно Вы собираетесь решать, какая запись из найденного набора нужна?

Реаниматор 02-12-2011 10:04 1807825

Цитата:

Цитата DmitriiV
Как именно Вы собираетесь решать, какая запись из найденного набора нужна? »

Самая последняя

Цитата:

Цитата DmitriiV
Это невозможно. В противном случае Вы не сможете обращаться к экземплярам коллекции. »

Мне не нужна коллекция мне нужна последняя запись в Журнале событий

DmitriiV 02-12-2011 11:00 1807855

Цитата:

Цитата Реаниматор
Самая последняя »

По времени что-ли?

Реаниматор 02-12-2011 11:10 1807859

Цитата:

Цитата DmitriiV
По времени что-ли? »

Неважно, нужна первая запись которая отобрана по фильтру в Set colLoggedEvents = objWMIService.ExecQuery
Вот 1с запрос, нужно тоже самое только в скрипте:
Запрос = Новый Запрос ("ВЫБРАТЬ ПЕРВЫЕ 1
| Message
|ИЗ
| ЖурналСобытий
|ГДЕ
| Logfile = "System"
| И SourceName = "User32"
| И (EventCode = 1074 ИЛИ EventCode = 1076)";
Выборка = Запрос.Выполнить();
Если Выборка.Следующий() Тогда
Если Найти(Выборка.Message, "Выключение компьютера") > 0 Тогда
//Тут запускаю архивацию
КонецЕсли;
КонецЕсли;

Loran_rus 02-12-2011 11:20 1807865

Можно счетчиком будет брать только до i=1 сообщения в журнале начиная с самого последнего события
Цитата:

по фильтру в Set colLoggedEvents = objWMIService.ExecQuery
Код:

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colLoggedEvents = objWMIService.ExecQuery("Select * from Win32_NTLogEvent Where Logfile = 'System' and SourceName='User32' and (EventCode = '1074' or EventCode = '1076')")

For Each objEvent in colLoggedEvents
        If i=1 Then
                Exit For
        End If
                If InStr(objEvent.Message, "Тип выключения: Завершить работу") or InStr(objEvent.Message, "Тип выключения: Выключение питания")> 0 Then
        msgbox "Выключение а не перезагрузка"
                End If
        i=i+1
Next


Реаниматор 02-12-2011 12:02 1807886

Это неправильно...
Вот так можно сделать ?
Set colLoggedEvents = objWMIService.ExecQuery("Select TOP 1 Message from Win32_NTLogEvent Where Logfile = 'System' and SourceName='User32' and (EventCode = '1074' or EventCode = '1076')")
Или
Set colLoggedEvents = objWMIService.ExecQuery("Select 1 Message from Win32_NTLogEvent Where Logfile = 'System' and SourceName='User32' and (EventCode = '1074' or EventCode = '1076')")

Вот так можно? Он тут выберет только одну запись, как ее потом можно получить без FOR. т.е. как сделать МояЗапись = colLoggedEvents.Выбрать(); или МояЗапись = colLoggedEvents.Прочитать();

DmitriiV 02-12-2011 13:12 1807934

Цитата:

Цитата Реаниматор
Неважно, нужна первая запись которая отобрана по фильтру...»

Стало быть, не самая последняя, а первая попавшаяся.
В таком случае Ваш вариант с использованием оператора Exit For полностью решает эту задачу.

Loran_rus, Реаниматор, не тратьте время попусту. В данном случае нет способа получить ссылку только на один экземпляр коллекции. Можно лишь при переборе "отсеивать" ненужные экземпляры по тому или иному признаку.


Время: 23:15.

Время: 23:15.
© OSzone.net 2001-