65.9K
CodeProject 正在变化。 阅读更多。
Home

以管理员身份运行批处理文件时的注意事项

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2011年2月21日

CPOL

2分钟阅读

viewsIcon

21853

你确定你的批处理文件真的会按照你的意图执行吗?

引言

本技巧解释了以管理员身份运行批处理文件或命令脚本的某种危险。它适用于运行 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 位操作系统可能有所不同,未检查。

© . All rights reserved.