首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么控制台输出会阻止自引用批处理脚本干净地退出?

为什么控制台输出会阻止自引用批处理脚本干净地退出?
EN

Stack Overflow用户
提问于 2016-06-02 04:44:15
回答 1查看 114关注 0票数 3

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

但是,当以"start“命令和"/b”开关启动的第二个命令窗口包含至少一个"echo“命令时,它不会干净地退出,需要我按Enter键才能完全退出那个”嵌套“命令窗口。

我已经将代码提炼成9行,希望您能明白我的意思。要查看它的运行情况,请将以下代码另存为"test.bat“,然后从命令提示符处运行它:

代码语言:javascript
代码运行次数:0
运行
复制
@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键,然后将控制返回到提示。

如果删除该行:

代码语言:javascript
代码运行次数:0
运行
复制
echo There was at least one argument.

退出第二个命令shell不再需要Enter键。类似地,如果echo命令的输出被重定向到一个文件,这个问题就会消失。这个问题在没有echo命令的情况下也会发生,但是如果输出是从EG生成的,那么这似乎是由于存在某种形式的控制台输出。这可以通过注释掉"echo“行和第一行"@echo off”来轻松演示-命令现在被回显到控制台,它在退出之前再次挂起。

我可以通过将"start“调用更改为以下代码来解决此问题:

代码语言:javascript
代码运行次数:0
运行
复制
start "" /min cmd /c test.bat arg1

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

我很想知道为什么我发布的代码是这样的,为什么它不能在不按Enter键的情况下干净利落地退出。我得到的唯一线索是来自此页面Close and exit batch files矩阵中的“备注”列,其中指出:“确保控制台窗口中不显示任何文本,使其在批处理文件结束时自动关闭”。然而,这似乎只涉及command.com的Windows9.x版本-而不是EG Windows10或cmd.exe。

感谢您的任何意见/想法。

-s1m0n-

EN

回答 1

Stack Overflow用户

发布于 2016-06-02 08:52:42

你曲解了输出。如果我没理解错的话,它看起来是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
C:\working\test>test
There were no arguments.

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

事情是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
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打印了什么,所以它没有理由认为它需要重新打印提示符。但是如果你输入一个命令,它就会起作用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37578452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档