2012-05-21 27 views
5

Używam Edytora zasad grupy, który jest częścią systemu Windows 7 (również systemu Windows XP) do uruchamiania tak zwanego skryptu zamknięcia, który będzie automatycznie wykonywany za każdym razem, gdy system jest zamykany lub uruchamiany ponownie. Mój problem: muszę wiedzieć w moim skrypcie, czy użytkownik wybrał zamknięcie systemu, czy też zamiast tego wybrał opcję ponownego uruchomienia. Obie czynności spowodują, że Windows uruchomi skrypt zamknięcia, ale jak mogę określić podczas wykonywania skryptu, które działanie zostało faktycznie wykonane?W skrypcie systemu Windows 7, w jaki sposób określić, czy bieżące zamknięcie systemu jest rzeczywiście ponownym uruchomieniem?

Czy jest jakiś sposób wiedzieć, podczas zamykania systemu, czy system obecnie wykonuje wyłączenie lub ponowne uruchomienie?

Odpowiedz

8

Na systemach pre-vista można kwerendy rejestru:

Znaleziony pod HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer sklepach wybrana ostatnio z listy w oknie dialogowym Zamykanie systemu Windows dla bieżącego użytkownika ustawień Shutdown Setting DWORD.

Na nowszych systemach można kwerendy Systemu Eventlog w skrypcie zamykania, na przykład:

$systemstateentry = get-eventlog -LogName system -Source User32 | ?{$_.eventid -eq 1074} | select -first 1 

switch -regex ($systemstateentry.message) 
    { 
     ".*restart.*" {"restart"} 
     ".*power off.*" {"power off"} 
     default {"unknown"} 
    } 
+0

dziękuję, to jest również prawdą, jeżeli zamknięcie lub restart zrobiono programowo lub za pośrednictwem linii poleceń, jak po uruchomieniu „shutdown.exe -r” lub „shutdown.exe -s” z cmd- Okno? Naprawdę chciałbym rozpoznać zamknięcie systemu lub ponowne uruchomienie, bez względu na to, jak został zainicjowany. – Erik

+0

Oprócz mojej poprzedniej odpowiedzi: Niestety, ta wartość nie istnieje na żadnym z moich systemów Windows 7, a także nie jest obecna podczas zamykania, napisałem trochę VB Script sprawdzania dla tej wartości podczas zamykania/ponownego uruchamiania, ale rejestr wartość jest po prostu nieobecna. Czy możesz sprawdzić, czy ta wartość jest obecna na komputerze Win7? Czy ta informacja nadal jest prawdziwa dla Win7? – Erik

+0

Zaktualizowano odpowiedź dla systemu Windows Vista/7 –

1

Ten kod bash używa narzędzia wevtutil.exe celu określenia, czy system jest restartu. Migracja do skryptu wsadowego nie powinna być trudna. W przypadku systemu Windows innego niż angielski należy zastąpić restart równoważnym terminem zarejestrowanym w dzienniku zdarzeń. This blog post rozwiązuje problem z większą ilością szczegółów.

query='*[System[(EventID=1074) and TimeCreated[timediff(@SystemTime) <= 60000]]]' 
current_shutdown=$(wevtutil qe system -c:1 -rd:true -f:xml -q:"$query") 
rebooting=$(grep -iE "<data[^<>]*>restart</data>" <<<"$current_shutdown") 

if [[ -n "$rebooting" ]]; then echo 'System is rebooting' 
elif [[ -n "$current_shutdown" ]]; then echo 'System is shutting down' 
else echo 'System is neither rebooting nor shutting down'; fi