以管理员身份运行批处理文件时的注意事项
你确定你的批处理文件真的会按照你的意图执行吗?
引言
本技巧解释了以管理员身份运行批处理文件或命令脚本的某种危险。它适用于运行 Windows Vista 或更高版本,并启用了用户帐户控制的系统。
背景
我经常使用批处理文件来清理不必要的文件(构建目标、设置等),以管理员身份运行它差点删除了我的操作系统。我发布这个是为了警告可能犯同样错误的人。
详细说明
有什么危险?
简单来说,当你以管理员身份运行批处理文件时,工作文件夹会更改为 %SystemRoot%\system32
(通常是 C:\Windows\system32)[1]。
演示
要自己检查一下,创建一个包含以下内容的简单批处理文件,并将其命名为你喜欢的任何名称,例如 test.bat。
@cd
@pause
现在通过双击文件运行它。注意显示的路径,应该是保存文件的文件夹。现在再次以管理员身份运行它 - 右键单击文件并选择以管理员身份运行(或者你本地语言中的相应选项)。显示的路径会不同。
C:\Windows\system32
按任意键继续...
按任意键继续...
图:以管理员身份运行时示例输出
解释
这实际上超出了本技巧的范围,但如果你想知道的话
cd
不带参数会打印当前目录(在这种情况下是文件的当前工作目录)pause
会阻止控制台窗口关闭,以便你可以看到上面的输出- 每个命令开头的
@
可以防止命令本身被回显(尝试不使用@
来看看我的意思)。
注意: 下面的示例中的
echo off
也会做同样的事情,它会阻止之后所有命令的回显。那里的@
可以防止该命令本身被回显。
修复
与其说是修复,不如说是一种你可以考虑使用的健全性检查。如果文件命名如上所示,你可以执行以下操作
@echo off
if not exist test.bat goto _ERRROR
rem The actual work of the file is done here
goto _END
:_ERROR
echo Invalid directory!
:_END
解释
顶部的 if
语句检查批处理文件本身是否存在于当前文件夹中。如果你以管理员身份运行,工作文件夹会是其他东西,因此条件将为真,并且控制权将传递到 _ERROR
标签,跳过所有内容。
这只是我临时想到的一个例子,你可以使用任何你喜欢的变体。
就这样,安全运行!
--
更新
请参阅 Reto70 下方的替代方案,它提供了一种比我的错误检查更好的方法。
--
[1] 在多个系统上检查过。64 位操作系统可能有所不同,未检查。