gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:19:37 26 4
gpt4 key购买 nike

我正在编写一个自引用 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

它将打印“There were no arguments”。在提示下方,然后是“至少有一个争论”。在提示符处然后挂起,等待 Enter 键,然后再将控制权返回给提示符。

如果删除该行:

echo There was at least one argument.

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

我可以通过将“开始”调用更改为此来解决这个问题:

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

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

我很想知道为什么我发布的代码会这样运行,为什么它不要求按下 Enter 键就不会干净地退出。我唯一的线索来自本页矩阵中的“备注”栏 Close and exit batch files指出,“确保控制台窗口中没有显示任何文本,以使其在批处理文件末尾自动关闭”。然而,这似乎仅指 command.com 的 Windows 9.x 版本——而不是 EG Windows 10 或 cmd.exe。

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

-s1m0n-

最佳答案

您误解了输出。如果我没理解错的话,它看起来像这样:

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 打印了什么,所以它没有理由认为它需要重新打印提示。但是,如果您输入命令,它将起作用。

关于windows - 为什么控制台输出会阻止自引用批处理脚本干净地退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37578452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com