PDA

Показать полную графическую версию : Как проверить что выполняется выключение компьютера а не перезагрузка ?


Реаниматор
01-12-2011, 13:21
Редактор локальной групповой политики gpedit.msc
Конфигурация компьютера - Конфигурация Windows - Сценарии - Завершение работы

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

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

Kazun
01-12-2011, 14:54
wevtutil qe system /c:1 /rd:true /q:"*[System[EventID=1074]]"

Реаниматор
02-12-2011, 07:44
Оно и на перезагрузку тоже работает, мне надо только на выключение.

Я сделал так:
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
Замените 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
или уберите не нужный Евент из (EventCode = '1074' or EventCode = '1076') »
Так они оба нужные, сложно скопипастить то что я написал и поменять ? Я не могу понять куда вставить Select Case testexpression

DmitriiV
02-12-2011, 09:52
... Помогите избавиться от For...»Это невозможно. В противном случае Вы не сможете обращаться к экземплярам коллекции.

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

Реаниматор
02-12-2011, 10:04
Как именно Вы собираетесь решать, какая запись из найденного набора нужна? »
Самая последняя

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

DmitriiV
02-12-2011, 11:00
Самая последняя »По времени что-ли?

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

Loran_rus
02-12-2011, 11:20
Можно счетчиком будет брать только до 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
Это неправильно...
Вот так можно сделать ?
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
Неважно, нужна первая запись которая отобрана по фильтру...»Стало быть, не самая последняя, а первая попавшаяся.
В таком случае Ваш вариант с использованием оператора Exit For полностью решает эту задачу.

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




© OSzone.net 2001-2012