我的批处理文件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上运行批处理文件时,会导致无限循环。
这种意外批处理文件处理的原因是什么?
答案 0 :(得分:3)
建议在批处理文件中调用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中定义了哪些目录当前命令进程。在这种情况下,目录的顺序也很重要。
有关搜索可执行文件的详细信息,请参阅Where is “START” searching for executables?上的答案。但请注意,虽然 start 适用于所有基于Windows NT的Windows命令处理器cmd.exe
的内部命令,但命令处理器本身仅使用 PATHEXT 和 PATH 并忽略Windows注册表中的 App Paths 键。在What is the reason for '...' is not recognized as an internal or external command, operable program or batch file?
无限循环很可能是由Dennis van Gils已经假设批处理文件reg.bat
命名的。因此,命令处理器在当前目录中查找名为REG
的可执行文件,该文件reg.bat
已经处理过,并继续对该批处理文件进行批处理,并将其他字符串作为参数传递给{{1} }。换句话说,批处理文件在无限循环中一次又一次地启动。
还有一点需要注意:
此处应使用控制台应用程序reg.bat
将字符串值添加到注册表配置单元 HKEY_LOCALE_MACHINE 。整个计算机的写入操作需要管理员权限。因此,对于使用此批处理文件的当前用户禁用了用户帐户控制(UAC),或者分别使用以管理员身份运行 Runas来执行此批处理文件。否则,由于缺少权限,reg.exe
无法将字符串值添加到注册表中。