批处理文件在第一个命令后停止运行

92

我正在使用工具“HTML Match”来比较两个HTML文件。因为我需要比较很多文件,所以我创建了一个像以下的批处理文件。例如,我只提供五组文件。

cd "C:\Program Files\HTML Match"
HTMLMATCH.EXE "D:\Raj\compare1\a1.html" "D:\Raj\compare2\a1.html" "D:\Raj\compare_res\a1.html"
HTMLMATCH.EXE "D:\Raj\compare1\a2.html" "D:\Raj\compare2\a2.html" "D:\Raj\compare_res\a2.html"
HTMLMATCH.EXE "D:\Raj\compare1\a3.html" "D:\Raj\compare2\a3.html" "D:\Raj\compare_res\a3.html"
HTMLMATCH.EXE "D:\Raj\compare1\a4.html" "D:\Raj\compare2\a4.html" "D:\Raj\compare_res\a4.html"
HTMLMATCH.EXE "D:\Raj\compare1\a5.html" "D:\Raj\compare2\a5.html" "D:\Raj\compare_res\a5.html"

当我在命令提示符中执行这个批处理文件时,只有第一行,也就是'a1.html',被比较并产生了结果。然后执行就停止了。

4个回答

151

在你运行的命令前添加call

你也可以将此更改为for循环,如下:

FOR /L %%i in (1,1,5) DO CALL HTMLMATCH.EXE D:\Raj\compare%%i%%\a%%i%%.html D:\Raj\compare%%i%%\a%%i%%.html D:\Raj\compare_res\a%%i%%.html

你是指在我给出的每一行前面都加上“call”吗?还是只需要调用xyz.bat文件? - rajashekar
2
除了可能的 cd 命令之外,我指的是在你编写的每一行前面加上 call 命令。 - Ben
文件名可能会从这种格式更改为其他名称。如果指定了文件夹路径,有没有一种方法可以读取文件名,然后对每个文件名执行它? - rajashekar
是的,for循环可以做到这一点。根据您的需要进行更改。在cmd窗口中键入“help for”以查找所需信息。添加“call”是否有帮助? - Ben
1
能否解释一下为什么,为什么一开始它就不能工作? - Salman A

84
你的问题的解决方法是编写CALL HTMLMATCH.EXE(以及其余的参数)。 在批处理文件中,只需在每个可执行命令前面使用CALL即可。

50
今天我写了五年来的第一个批处理文件,然后遇到了同样的问题。如果有人想知道原因,添加"call"命令的原因是因为在第一个批处理文件中直接调用第二个批处理文件会导致第二个批处理文件替换掉第一个批处理文件在解释器中的位置。当第二个批处理文件退出时,解释器将会忘记你所调用的原始批处理文件。而使用"call"命令可以使解释器跟踪第一个批处理文件离开的位置,并在第二个批处理文件退出后返回那里。 - Mark Bessey
2
@MarkBessey:是的,当从第一个批处理文件中调用第二个批处理文件时,您绝对是正确的,但这里不是这种情况,因为被调用的程序是.EXE文件,它不需要CALL - Aacini
这是正确的,但我认为解决相关问题是值得的,因为这是在这里搜索更常见问题时出现的结果。我也想不到其他描述行为发生的方式,所以我想知道描述是否缺少某些细节。 - Mark Bessey
3
@Aacini 看起来某些可执行文件以一种奇怪的退出代码退出,这会阻止批处理文件的其余部分运行,在这种情况下,使用CALL在另一个批处理文件中运行它的解决方法有效。 - Mahn

2
我正在寻找非常相似的东西,尝试了这里留下的所有回复,但最终找到了解决我的问题的方法!在我的脚本中,我想检查一个进程是否正在运行,如果没有,则启动它(一个.exe文件),然后检查另一个进程是否正在运行,如果没有,则也启动它(但保留所有打开的程序),问题是第一个.exe已经启动,但因为等待进程结束而无法转移到第二个.exe。对我来说,它最终可以工作的方法是使用start,并且神奇的是...

/separate

对我而言,它的作用是:

start "program1" /separate program1.exe
other commands

在启动程序1后,它停止了,因为它在等待关闭,但我认为这不会发生,因为我想让它保持打开状态。现在使用start/separate命令,它可以继续执行其他命令。
我在另一个论坛中找到了这个方法,但问题是,/separate是用来在另一个内存空间中启动程序的。

-1

在没有空格标记的情况下,您不必插入引号。

试试这个:

HTMLMATCH.EXE D:\Raj\compare1\a1.html D:\Raj\compare2\a1.html D:\Raj\compare_res\a1.html

或许这可以解决你的问题。


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