在Windows关机时执行批处理脚本

43

Windows 7 Professional 中,有没有办法在用户点击“关机”时运行批处理脚本(例如 .BAT 文件)?(不是计划关闭计算机的批处理文件,仅在用户单击“关机”时运行)

理想情况下,这样的脚本将显示命令提示符窗口,并提供取消关机过程的选项。

最好使用不需要第三方实用程序的解决方案。


你成功防止了关机吗?如果是,你是如何做到的?谢谢。 - Alex
1
如果您想防止用户关闭计算机,可以通过组策略禁用开始菜单中的访问。转到 _用户配置\策略\管理模板\开始菜单和任务栏_,查找 删除和防止访问关闭、重新启动、睡眠和休眠命令。这将从开始菜单中隐藏这些选项。如果您需要允许重启,可以将批处理文件添加到 所有用户\Desktop 文件夹中,以调用 shutdown.exe \r \t 10 命令,在 10 秒后强制重启计算机。 - Slicktrick
好的,那么你如何调试脚本呢? 即使只是将输出转储到文件中也会有所帮助。 - RoboJ1M
相关问题 https://stackoverflow.com/q/52581235/45375 询问如何_script_(自动化)安装一个关机脚本(而不需要呈现可见的控制台窗口给用户)。 - mklement0
6个回答

70

有没有办法在附加到此关闭事件的脚本中防止关机? 我尝试了一个带有shutdown /a的批处理文件,但似乎不起作用。 - Alex
4
谢谢。注意,你需要拥有“Windows 专业版”或“旗舰版”才能进行此操作。如果你只有标准家庭版(就像我一样),那么你可以从这里手动添加群组策略编辑器:http://www.askvg.com/how-to-enable-group-policy-editor-gpedit-msc-in-windows-7-home-premium-home-basic-and-starter-editions/。 - benscabbia
5
在关闭VirtualBox虚拟机之前为其编写savestate脚本非常有帮助。谢谢! - jbwebtech
2
我该如何在“休眠”而不是“关机”时执行此操作? - doubleOrt
2
请注意,如此问题所述,如果您想要在注销时运行批处理脚本,则发现直接引用.bat文件不起作用。但是,如果我将C:\Windows\System32\cmd.exe用作脚本名称,将/C C:\path\to\batch\script.bat用作脚本参数,则可以实现。 - Nova

5
很简单的一种修改注册表的方式: 我在 2008 r2 和 2016 服务器上尝试过。
需要完成以下步骤: 1. 创建一个文本文件“regedit.txt”。 2. 将下面的代码粘贴到其中:
Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown] 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Shutdown]     

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown\0]  
"GPO-ID"="LocalGPO"    
"SOM-ID"="Local"    
"FileSysPath"="C:\\Windows\\System32\\GroupPolicy\\Machine"    
"DisplayName"="Local Group Policy"    
"GPOName"="Local Group Policy"    

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown\0\0]    
"Script"="terminate_script.bat"    
"Parameters"=""    
"ExecTime"=hex(b):00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00    

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Shutdown\0]
"GPO-ID"="LocalGPO"    
"SOM-ID"="Local"    
"FileSysPath"="C:\\Windows\\System32\\GroupPolicy\\Machine"    
"DisplayName"="Local Group Policy"    
"GPOName"="Local Group Policy"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Shutdown\0\0]    
"Script"="terminate_script.bat"    
"Parameters"=""
"IsPowershell"=dword:00000000
"ExecTime"=hex(b):00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
  1. Save this file as regedit.reg extension

  2. Run it on any command line using below command:

    regedit.exe /s regedit.reg
    

4

3
程序上可以使用SCHTASKS工具实现:SCHTASKS
SCHTASKS /Create /SC ONEVENT /mo "Event[System[(EventID=1074)]]" /EC Security /tn on_shutdown_normal /tr "c:\some.bat" 

SCHTASKS /Create /SC ONEVENT /mo "Event[System[(EventID=6006)]]" /EC Security /tn on_shutdown_6006 /tr "c:\some.bat" 

SCHTASKS /Create /SC ONEVENT /mo "Event[System[(EventID=6008)]]" /EC Security /tn on_shutdown_6008 /tr "c:\some.bat" 

3

我在搜索Windows 10的启动和关闭脚本时找到了这个主题。上面的答案都不起作用。对于我来说,在Windows 10上,当我把脚本放到任务计划程序中时,它就起作用了。如何操作:按下Windows键并写入“任务计划程序”,打开它,然后右侧是“添加任务...”按钮。在这里,您可以添加脚本。 附注:我找到了启动和注销用户的操作,但没有关机操作。


1
当我这样做时,我找不到“注销用户”选项。它叫什么或者我该如何找到它? - Kajsa

2

为了使上述代码正常运行,您需要确保以下目录存在(我的没有)。只需将以下内容添加到批处理文件中并运行即可:

mkdir C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
mkdir C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown
mkdir C:\Windows\System32\GroupPolicy\User\Scripts\Startup
mkdir C:\Windows\System32\GroupPolicy\User\Scripts\Shutdown

就是因为GP需要这些目录存在才能实现以下功能:

Group Policy\Local Computer Policy\Windows Settings\Scripts (Startup/Shutdown)

以便正常运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接