为什么控制台输出使自引用批处理脚本不能完全退出?

时间:2016-06-01 20:44:15

标签: windows batch-file cmd

我正在编写一个自引用的Windows 10(自制版)批处理脚本,用于在大量日志文件中查找字符串,创建结果文件,完成后,在notepad ++中打开日志文件。此过程有时需要几分钟,因此自引用部分允许我将控制权返回到原始命令窗口,直到打开日志文件(并获得焦点)。

然而,当第二个命令窗口以" start"开始时命令和" / b"开关,包括至少一个" echo"命令它不会干净地退出并要求我按Enter键完全退出"嵌套"命令窗口。

我已将代码简化为九行,以便您可以看到我的意思。要查看它的实际效果,请将以下内容保存为" test.bat"并从命令提示符运行它:

@echo off
if "%1" EQU "" call :noArgs & goto :done
echo There was at least one argument.
:done
exit /b
:noArgs
echo There were no arguments.
start "" /b cmd /c test.bat arg1
goto :eof

它将打印"没有争论。"在提示符下面跟着"至少有一个参数。"在提示符处然后挂起,等待Enter键,然后将控制权返回给提示符。

如果删除该行:

echo There was at least one argument.

第二个命令shell退出时不再需要Enter键。同样,如果echo命令的输出重定向到文件,问题就会消失。没有echo命令也会出现这个问题,但是如果从EG生成输出类型命令,那么它似乎是由于存在某种形式的控制台输出。通过评论" echo"可以很容易地证明这一点。线路以及第一线" @echo off" - 现在命令回显到控制台,它会在退出之前再次挂起。

我可以通过改变" start"来解决这个问题。请致电:

start "" /min cmd /c test.bat arg1

然而,在最小化窗口中不再容易看到任何输出,因此它是一个糟糕的解决方案。

我很想知道为什么我发布的代码行为方式,为什么它不会干净地退出而不需要按Enter键。我唯一的线索来自"备注"此页面上的矩阵中的列Close and exit batch files表示,"确保控制台窗口中没有显示任何文本,以使其在批处理文件的末尾自动关闭"。但是,这似乎只涉及Windows 9.x版本的command.com - 不是EG Windows 10,也不是cmd.exe。

感谢您的任何意见。

-s1m0n -

1 个答案:

答案 0 :(得分:4)

你误解了输出。如果我理解你,它看起来像这样:

C:\working\test>test
There were no arguments.

C:\working\test>There was at least one argument.

发生的事情是这样的:

C:\working\test>                                    <---- output from first shell
                test                                <---- input
There were no arguments.                            <---- output from first shell
                                                    <---- output from first shell
C:\working\test>                                    <---- output from first shell
                There was at least one argument.    <---- output from second shell
                                                    <---- cursor is here

第二个shell是异步运行的 - 这就是start的作用 - 所以第一个shell已经完成了批处理作业,并在第二个shell到达打印输出时打印了下一个提示。

此时,第二个shell已退出,第一个shell正在等待您输入命令。它不知道第二个shell已经打印了任何东西,所以它没有理由认为它需要重新打印提示。但是如果你输入一个命令,它就会起作用。