我正在编写一个自引用的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 -
答案 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已经打印了任何东西,所以它没有理由认为它需要重新打印提示。但是如果你输入一个命令,它就会起作用。