在Windows 7脚本中,如何确定当前系统关闭是否实际上是重新启动?

时间:2012-05-21 09:55:55

标签: powershell windows-7 vbscript shutdown reboot

我使用组策略编辑器,它是Windows 7(也是Windows XP)的一部分,用于运行所谓的关闭脚本,每次系统关闭或重新启动时都会自动执行该脚本。我的问题是:我需要在我的脚本中知道用户是否已选择关闭系统,或者是否已选择重新启动。这两个操作都会使Windows运行关闭脚本,但是如何在该脚本执行期间确定实际执行了哪个操作?

有没有办法知道,在关机期间,系统当前是执行关机还是重启?

2 个答案:

答案 0 :(得分:8)

pre-vista系统上,您可以查询注册表

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer下找到的Shutdown Setting DWORD存储当前用户的“关闭Windows”对话框中列表中最近选择的设置。

更新的系统上,您可以在关机脚本中查询系统事件日志,如下所示:

$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"}
    }

答案 1 :(得分:1)

此bash代码使用wevtutil.exe实用程序来确定系统是否正在重新启动。迁移到批处理脚本应该不难。对于非英语Windows,请将restart替换为事件日志中注册的等效术语。 This blog post涵盖了有关详细信息的问题。

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