【问题标题】:How can I stop the execution window from closing immediately?如何阻止执行窗口立即关闭?
【发布时间】:2020-09-26 19:11:42
【问题描述】:

使用 Windows,我在我的 cmd 窗口中输入了一个命令来运行一个可执行文件,其中包含您的基本“Hello, world!”。程序打印的行。但是,当我输入“start out.exe”命令时,一个窗口会很快打开和关闭。我猜这个窗口是打印 hello world 消息的窗口,但它关闭得这么快(可能是因为程序完成了)。我是否有某种设置导致窗口立即关闭?这只是默认值吗?如果是这样,我是否可以更改设置或其他内容以防止窗口立即关闭(不改变程序的性质)?在此先感谢您的帮助。我见过一些类似的问题,但我见过的问题是专门针对 Linux/Unix 或建议更改程序本身的。

【问题讨论】:

标签: windows terminal command


【解决方案1】:

如果您拥有 .PDB 文件,在 构建 时生成(.EXE 文件的符号)并且需要 .DLL 程序库(在您的情况下,由于“Hello World”程序的简单性质,可能不需要这些库),您可以尝试在 Visual Studio 中将可执行文件作为项目打开,然后将调试器附加到它,使用断点停止程序执行在主返回之前This article shows how to do it as a proof of concept.

打开 .EXE 文件,方法是打开 VS 并导航到 File-Open-Project/Solution 并选择可执行文件,然后右键 -点击您的“解决方案”并按Debug-Start new instancePDBDLL 文件应与 EXE 文件位于同一文件夹中

如果您也没有该程序的源代码可用,请按照以下建议尝试调试它:

为了有效地调试,您还需要用于构建 EXE 的源代码,即使只是您关心的几个文件。您需要找到这些文件并在 Visual Studio 中打开它们。如果源代码与构建的源代码不完全相同,则当您尝试插入断点并且断点不会绑定时,EXE Visual Studio 会警告您。可以从断点设置查看窗口覆盖该行为。在设置查看窗口中单击必须匹配源链接文本,然后选中该框以允许不匹配的源,如下图所示。当然,如果来源不匹配,您永远不会真正知道会发生什么,因此使用风险自负。

免责声明:我不确定这种方法在没有源文件的情况下如何有效,但我认为在不更改实际程序的情况下,它最接近您的答案。

作为另一种选择,您可以尝试通过创建一个自定义程序来调用您的可执行文件,该程序调用该程序并重定向其 stdoutstderr,例如like this ,或使用管道check there。自定义程序最终将使用原始 .exe 程序作为可执行程序创建一个进程,并使用 stdout/stderr 执行某些操作,例如在自定义程序控制台中显示它们或将输出保存到文件中,从而允许您读取原始程序输出没有关闭窗口的问题(当然,原来的窗口仍然会自行关闭,但我认为这对你来说没有太大关系)。

或者,如果您想要一种快速的'n'dirty 方式,您可以尝试通过创建调用程序Java program 来捕获程序输出。将 commands 数组替换为带有参数的程序可执行名称:

Runtime rt = Runtime.getRuntime();
String[] commands = {"system.exe", "-get t"};
Process proc = rt.exec(commands);

BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(proc.getInputStream()));

BufferedReader stdError = new BufferedReader(new 
InputStreamReader(proc.getErrorStream()));

// Read the output from the command
System.out.println("Here is the standard output of the command:\n");
String s = null;
while ((s = stdInput.readLine()) != null) {
    System.out.println(s);
}

// Read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
    System.out.println(s);
}

【讨论】:

    猜你喜欢
    • 2022-12-12
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多