批处理文件只包含REG ADD命令时出现无限循环的原因可能是什么?

3

我在批处理文件test.bat中有以下代码行,它会向Windows注册表中添加一个条目:

@echo off
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Server" /v DisplayName /t REG_SZ /d Server /f

当我在命令提示符窗口中运行相同的命令时,它是有效的。但是,当我将这个命令放入批处理文件test.bat中并在Windows 7上运行该批处理文件时,它会导致无限循环。

这种意外批处理文件处理的原因可能是什么?


3
运行此批处理文件的文件名是什么?确保不要将其命名为REG.bat或类似名称,因为这样它将把reg视为对自身的调用而非命令。 - Dennis van Gils
1
你使用的是哪个Windows版本?你能查询到密钥吗,还是也失败了?REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Server" /v DisplayName - jeb
当我在命令提示符上运行相同的代码时,它可以正常工作,但是当我将这行代码放入批处理文件中时,它会进入无限循环。我正在使用Windows 7操作系统,批处理文件的名称为test.bat。 - anonymous
1个回答

4

在批处理文件中调用像reg这样的应用程序时,建议始终使用完整路径和文件扩展名而不是仅使用文件名。因为reg不是Windows命令处理器cmd.exe的内部命令。

@echo off
%SystemRoot%\System32\reg.exe ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Server" /v DisplayName /t REG_SZ /d Server /f

仅使用 REG 命令时,取决于当前命令进程的环境变量 PATHEXT 中定义的可执行文件/脚本的文件扩展名,以及环境变量 PATH 中定义的目录。在这种情况下,目录的顺序也很重要。
有关可执行文件搜索的更多详细信息,请参见此处的答案。但请注意,尽管 start 是所有基于 Windows NT 的 Windows 的内部命令,但命令处理器本身仅使用 PATHEXTPATH,并忽略 Windows 注册表中的 App Paths 键。Windows 命令解释器的文件搜索行为在此处的答案中更详细地解释了。
无限循环最可能是由于将批处理文件命名为 reg.bat 导致的,如Dennis van Gils所说。因此,在搜索名称为 REG 的可执行文件时,命令处理器会在当前目录中找到文件 reg.bat,已经处理过这个文件,并将其他字符串作为参数传递给 reg.bat,从而在无限循环中继续批处理。
还要注意:
应该在此处使用控制台应用程序 reg.exe 来向注册表 hive HKEY_LOCALE_MACHINE 添加字符串值。对于整个计算机的写操作需要管理员权限。因此,当前用户要么使用此批处理文件禁用用户帐户控制(UAC),要么在执行此批处理文件时使用 以管理员身份运行Runas。否则,由于缺少权限,reg.exe 无法将字符串值添加到注册表中。

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