如何通过批处理文件关闭、重启或注销Windows?

682

我一直使用远程桌面连接来登录工作站。但在这个环境下,我不能使用开始菜单中的电源选项。我需要一种替代方法来关闭或重启计算机。

我如何通过命令行控制计算机的电源状态?

10个回答

1190

最常用的shutdown命令的方式如下:

  • shutdown -s — 关机。
  • shutdown -r — 重新启动。
  • shutdown -l — 注销。
  • shutdown -h — 进入休眠模式。

    注意:有一个常见的陷阱,用户认为 -h 意味着“帮助”(对于其他命令行程序来说是这样的...除了 shutdown.exe,它表示“休眠”)。然后他们运行了 shutdown -h 并意外关闭了计算机。要小心。

  • shutdown -i — “交互模式”。它不执行任何操作,而是显示 GUI 对话框。

  • shutdown -a — 取消先前的关机命令。

以上命令可以与以下附加选项组合使用:

  • -f — 强制程序退出。防止关机进程卡住。
  • -t <seconds> — 设置关机时间。使用-t 0立即关机。
  • -c <message> — 添加关机消息。该消息将出现在事件日志中。
  • -y — 强制所有关机查询回答"是"。

    注意:此选项未在任何官方文档中记录。它是由这些StackOverflow用户发现的。


我希望除了这个答案,还能提到其他一些非常好的答案。以下是没有特定顺序的答案。


196
请阅读下一个回答,了解如何使用“-f”(表示强制)。这是一个没有使用该选项的人告诉你的,现在他的电脑在周末期间被卡在关机过程中,而且还在地球另一端 (: - pasx
13
只是我使用了 /<switch> 而不是 -<switch>。帮助部分也使用了 / - legends2k
我的经验是:使用远程桌面中的-s选项(关闭)(如OP所述)仅终止远程桌面,但不影响远程计算机。 - Heri
4
我使用“-r”来远程控制机器。这样它就会重新启动而不需要手动干预。 - granadaCoder
6
如果你在远程机器上,你可能需要添加 -f 选项来强制重启。否则你的会话可能会关闭,而顽固的应用程序可能会挂起系统。要立即强制重启,请使用 shutdown -t 0 -r -f。如果想友好一点并给予一些时间,则可以使用此命令:shutdown -t 30 -r。超时会默认包含 -f 选项。 - Ole V.V.
首先,我想指出这个答案存在缺陷。shutdown -i不是用来填充函数或其他内容的。我确定它是用于在当前连接的局域网中远程关闭其他计算机的。而且shutdown -t xx不是一个独立的命令,所以你必须与shutdown -sshutdown -r一起使用。 - Kingzel

381
如果你在远程机器上操作,你可能需要添加-f选项来强制重新启动。否则,你的会话可能会关闭,并且一个顽固的应用程序可能会使系统卡死。
当我想立即强制重启时,我会使用这个方法:
shutdown -t 0 -r -f

如果想要更加友好地“给他们一些时间”的选项,可以使用以下代码:

shutdown -t 30 -r

正如您在评论中看到的那样,超时选项中已经暗示了-f。

Brutus 2006是一款提供这些选项的GUI工具。


15
阅读 Windows 8.1 中关于关闭程序的帮助文档,我看到:“如果超时时间大于0,则暗示使用/f参数。” 因为默认超时时间为30秒,所以我认为最好在给予一些时间进行清理关闭后,再在超时后进行强制关闭。 - Zitrax
2
这是个好观点。我相信当我写这个的时候,我使用的操作系统是Windows XP。我看到在Windows 7中,“/f是暗示的”备注也存在。我已经相应地修改了例子。 - JosephStyons
2
默认情况下,它们有30秒的时间。我使用以下命令进行立即关机:shutdown /r /t 0,并用于友好关机:shutdown /r。 - dzampino

85

没有人提到远程关机的-m选项:

shutdown -r -f -m \\machinename

另外:

  • -r参数会导致重新启动(通常在远程计算机上,这是您想要的,因为物理上启动它可能很困难)。
  • -f参数选项强制重新启动。
  • 当然,您必须具备适当的权限才能关闭远程计算机。

2
机器名称可以是IP地址吗?也就是说,你可以在互联网上这样做吗? - mcmillab
如果您可以通过 \\IP.AD.DR.ESS 访问该机器(即必要的端口已打开并且您具有所需的权限),那么是的,这应该可以在互联网上工作。 - Timothy Zorn
我最初尝试只用-r,但它没有起作用,因为我想进行远程关机。 shutdown -r -m可以实现远程关机,不需要使用-f。 - Dchris

40

原回答:2008年10月

您还得到了所有的"rundll32.exe shell32.dll"系列:

(请参见下面的更新)

  • rundll32.exe user.exe,**ExitWindows** [Fast Shutdown of Windows]
  • rundll32.exe user.exe,**ExitWindowsExec** [Restart Windows]

    rundll32.exe shell32.dll,SHExitWindowsEx n
    

其中n代表:

  • 0 - 注销(LOGOFF)
  • 1 - 关闭(SHUTDOWN)
  • 2 - 重启(REBOOT)
  • 4 - 强制(FORCE)
  • 8 - 断电(POWEROFF)

(可以组合使用,例如:6 = 2+4 FORCE REBOOT)


2015年4月更新(六年后):

1800 INFORMATION评论中指出:

不要使用rundll32.exe来实现此目的。它期望你在命令行上传递的函数具有非常特定的方法签名——它与ExitWindows的方法签名不匹配。

Raymond CHEN写道:

rundll32.exe调用的函数所需的函数签名是:

void CALLBACK ExitWindowsEx(HWND hwnd, HINSTANCE hinst,
       LPSTR pszCmdLine, int nCmdShow);

那并没有阻止人们使用rundll32来调用那些本不应由其调用的随机函数,比如user32 LockWorkStation或user32 ExitWindowsEx。
(哎呀)
ExitWindowsEx的实际函数签名为:
BOOL WINAPI ExitWindowsEx(UINT uFlags, DWORD dwReserved);

为了更加清晰明了:

Rundll32是Windows 95中遗留下来的,至少从Windows Vista开始就已经被弃用,因为它违反了许多现代工程指南。


3
关机和断电之间有何区别? - Asdfg
19
今天呢?没有。对于Windows NT4及之前的版本,主板并不总是支持关机,只能进行关闭(Windows完全关闭,但计算机仍在接通电源)。只有当硬件在该时期支持时,才能执行关闭电源功能,此时会关闭Windows并切断电源。今天,关闭和关闭电源都可以实现这一点。 - VonC
2
不要使用rundll32.exe来实现此目的。它期望你在命令行中传递的函数具有非常特定的方法签名 - 它与ExitWindows的方法签名不匹配。 - 1800 INFORMATION
参考:http://blogs.msdn.com/b/oldnewthing/archive/2004/01/15/58973.aspx,http://blogs.msdn.com/b/oldnewthing/archive/2014/04/08/10515006.aspx,http://blogs.msdn.com/b/oldnewthing/archive/2013/01/04/10382242.aspx,http://blogs.msdn.com/b/oldnewthing/archive/2011/09/09/10208136.aspx。 - 1800 INFORMATION
2
@1800INFORMATION 很好的观点。我已经重新修改了答案,明确说明这不是一个有效的选项。 - VonC
4
公平地说,即使你引起了何种类型的内存泄漏或堆栈损坏,如果你立即关闭计算机,那么它实际上并不重要。 - PRMan

12

另一个小提示:如果使用批处理文件,我希望能在不小心运行时中止它。因此,批处理文件会调用关机操作,但之后会让你停留在命令提示符处。

@echo off
echo Shutting down in 10 seconds. Please type "shutdown /a" to abort.
cmd.exe /K shutdown /f /t 10 /r

此外,由于它是计时器控制的,你会获得与在《俄勒冈之旅》中狩猎时相同的刺激感。

1
你可以在批处理文件中加入暂停命令,然后再加入中断命令,这样中断序列就会是任意键。 - rsk82
@rsk82,能够随意输入任何内容是我使用TRS-80版《俄勒冈小道》的一个不幸限制,但坦率地说,我一直认为这是作弊行为,每当我这样做时,我的兄弟都会感到愤怒。只是说:你为什么想要激怒我的兄弟呢? - Gavin

8

也许你已经知道这个,但以防万一:只需在“运行”框中键入shutdown -r(或任何您喜欢的命令)并按Enter键即可。

这样可以避免随处放置批处理文件。


是的...我只是喜欢让双击坐在那里...这也是-r批处理文件的作用 ;o) - Keng
20
小心不要将它放在程序->启动项中 :) - Dean Rather
如果将代码放置在shutdown.bat文件中,可能会得到一些意想不到的有趣行为。试试看! :) - Brethlosze

7
我来晚了,但我还没有看到这个答案。当您不想使用批处理文件或键入命令时,您可以将焦点设置为桌面,然后使用Alt + F4。Windows会询问您要做什么,选择关闭或重启即可。有关屏幕截图甚至视频,请参见:https://tinkertry.com/how-to-shutdown-or-restart-windows-over-rdp

3
@Keng,根据实际问题“我无法在开始菜单中使用关闭/重启功能”,我认为您想知道如何操作。命令行是一种解决方案,键盘是另一种解决方案。这可能有助于其他遇到此问题并只想要一个简单的关闭或重启解决方案的用户。 - msoft
1
只使用键盘(例如,鼠标不可用或为方便起见),另一个提示是使用Win + D将焦点设置在桌面上。 要在下拉菜单中选择选项,请使用Tab在对话框内切换焦点,使用空格打开下拉菜单,使用箭头选择并使用空格/Enter执行所选操作。 尝试编辑此内容,但编辑队列已满。 - MahNas92

7

当远程连接到一台机器时(目标机器是Windows XP,我不确定目标机器是否为Windows Vista),虽然开始菜单中的“关闭”被替换为“断开会话”或类似的选项,但应该有一个称为“Windows安全”的选项,它也可以像Owen所指出的那样执行与Ctrl + Alt + End相同的操作。


我曾经使用过那种方法,但现在不再起作用了,只能使用命令行。 - user324747
我还有一个小工具,里面有用于在远程桌面连接中进行关机、重启、休眠和锁定的按钮。 - user324747

6

如果要编写一个基本的注销命令,我会在NotepadWordPad中进行编写:

@echo off
shutdown -l

这基本上与手动点击“开始”和“注销”相同,但如果您已经准备好批处理文件,它会稍微快一些。


2

以下是与 shutdownrundll32.exe shell32.dll,SHExitWindowsEx n 命令相关的一些补充内容。

LOGOFF - 允许您按会话 ID 或会话名称注销用户

PSShutdown - 需要从 Windows Sysinternals 下载。

bootim.exe - Windows 10/8 关闭界面

change/chglogon - 防止新用户登录或占用另一个会话

NET SESSION /DELETE - 结束用户的会话

wusa /forcerestart /quiet - Windows 更新管理器,同时也可以重新启动计算机

tsdiscon - 断开连接

rdpinit - 注销您,尽管我目前找不到任何文档。


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