2012-05-21 19 views
5

Utilizo el Editor de directivas de grupo que es parte de Windows 7 (también de Windows XP) para ejecutar el llamado script de apagado, que se ejecutará automáticamente cada vez que se apague o reinicie el sistema. Mi problema es: necesito saber en mi script si el usuario ha seleccionado apagar el sistema, o si ha seleccionado reiniciar en su lugar. Ambas acciones harán que Windows ejecute el script de cierre, pero ¿cómo puedo determinar durante la ejecución del script qué acción se realizó realmente?En el script de Windows 7, ¿cómo puedo determinar si el cierre del sistema actual es realmente un reinicio?

¿Hay alguna forma de saber, durante el apagado, si el sistema actualmente realiza un apagado o un reinicio?

Respuesta

8

En sistemas de pre-vista puede consultar la Registro:

El Shutdown Setting DWORD encontrado en HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer almacena el ajuste seleccionado más recientemente de la lista en el cuadro de diálogo Salir de Windows para el usuario actual.

En más recientes sistemas, puede consultar el Sistema de Registro de sucesos en su secuencia de cierre, así:

$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

Muchas gracias, esto también es cierto si el apagado o reinicio se realizó mediante programación, o por medio de comandos, como si se ejecuta "Shutdown.exe -r" o "Shutdown.exe -s" de la cmd- ¿Ventana? Realmente me gustaría reconocer el apagado o el reinicio, sin importar cómo se inició. – Erik

+0

Además de mi respuesta anterior: desafortunadamente, este valor no existe en ninguno de mis sistemas Windows 7, y tampoco está presente durante el apagado, escribí un pequeño script de VB comprobando ese valor durante el apagado/reinicio, pero el registro el valor simplemente no está presente. ¿Puedes verificar si este valor está presente en tu máquina Win7? ¿Esta información sigue siendo cierta para Win7 en absoluto? – Erik

+0

Actualizó la respuesta para Windows Vista/7 –

1

Este código bash usa la utilidad wevtutil.exe para determinar si el sistema se está reiniciando. La migración al script por lotes no debería ser difícil. Para Windows que no es inglés, reemplace restart con el término equivalente registrado en el registro de eventos. This blog post cubre el problema con más detalles.

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 
Cuestiones relacionadas