我有一台 Server 2012 R2 Standard 64 位虚拟机,它的行为很奇怪。bat 文件工作正常,CMD 窗口正常关闭;但如果在执行 bat 文件期间关闭包含 bat 文件的文件夹,它将完成,但 CMD 窗口不会关闭。我已将其简化为最简单的 bat 文件。它包含 1 行。暂停
- 使用 Windows 资源管理器打开包含 bat 文件的文件夹
- 双击启动 bat 文件
- 关闭 Windows 资源管理器窗口
- 在CMD窗口中按任意键
- bat 文件完成后光标移动到下一行
- CMD 窗口仍然
这只发生在一台机器上。有人知道为什么会这样吗?这是一台测试虚拟机,也许应该重建,但这让我很好奇。谢谢
我将简单的 bat 文件替换为包含以下内容的文件:
@assoc .bat
@for /F "tokens=1,* delims==" %%G in ('assoc .bat') do @ftype %%H
@reg query "HKLM\Software\Microsoft\Command Processor" /v AutoRun 2>NUL
@reg query "HKCU\Software\Microsoft\Command Processor" /v AutoRun 2>NUL
@wmic process where "caption = 'cmd.exe'" get CommandLine, ParentProcessId, ProcessID
@echo please close Windows Explorer before continuing
@pause
@wmic process where "caption = 'cmd.exe'" get CommandLine, ParentProcessId, ProcessID
@pause
结果如下所示:
.bat=batfile
batfile="%1" %*
CommandLine ParentProcessId ProcessId
C:\Windows\system32\cmd.exe /c ""D:\test.bat" " 1608 8460
please close Windows Explorer before continuing
Press any key to continue . . .
CommandLine ParentProcessId ProcessId
C:\Windows\system32\cmd.exe /c ""D:\test.bat" " 1608 8460
Press any key to continue . . .
命令行
2016 年 4 月 13 日 在执行此操作时,我通过查看任务管理器发现了更多信息。当我启动 bat 文件时,任务管理器 - 详细信息窗口中会出现 2 行... 1 行是 cmd.exe,1 行是 conhost.exe。当 bat 完成后,cmd.exe 消失,但 conhost.exe 仍然存在。我注意到的另一件事是,您实际上不必像我之前所说的那样退出 Windows 资源管理器文件夹... 您所要做的就是单击资源管理器窗口中的任意位置。如果我没有单击资源管理器窗口中的任意位置,bat 文件的 CMD 窗口将正常关闭,并且两个任务都会从详细信息窗口中消失,正如我们预期的那样。
答案1
这不太可能,但您似乎已经排除了所有可能的情况。检查以下两个注册表项,看看它们是否包含任何内容:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
或者
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor
每次运行批处理文件时,其中的任何内容都会被调用,如果有的话,cmd /k
就会导致这种行为。
答案2
你尝试过这个吗?
@echo off
rem some code
pause
cls
exit
同样的事情,但允许相同的暂停并自行退出。
另外,为什么你要把 @ 放在所有命令前面?为什么不在其余命令之前使用 @echo off?