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