我正在写一个自引用的Windows10(主页版)。使用批处理脚本在大量日志文件中查找字符串,创建结果文件,完成后在notepad++中打开日志文件。这个过程有时需要几分钟,因此自引用部分允许我将控制返回到原始命令窗口,直到打开日志文件(并获得焦点)。
但是,当以"start“命令和"/b”开关启动的第二个命令窗口包含至少一个"echo“命令时,它不会干净地退出,需要我按Enter键才能完全退出那个”嵌套“命令窗口。
我已经将代码提炼成9行,希望您能明白我的意思。要查看它的运行情况,请将以下代码另存为"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
它将打印"There were no arguments“。在提示符下,后跟“至少有一个参数”。然后挂起,等待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矩阵中的“备注”列,其中指出:“确保控制台窗口中不显示任何文本,使其在批处理文件结束时自动关闭”。然而,这似乎只涉及command.com的Windows9.x版本-而不是EG Windows10或cmd.exe。
感谢您的任何意见/想法。
-s1m0n-
发布于 2016-06-02 00:52:42
你曲解了输出。如果我没理解错的话,它看起来是这样的:
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打印了什么,所以它没有理由认为它需要重新打印提示符。但是如果你输入一个命令,它就会起作用。
https://stackoverflow.com/questions/37578452
复制相似问题