在隐藏窗口的情况下从 c# 执行批处理文件时,批处理文件执行的程序将不会启动

本文关键字:批处理文件 执行 程序 启动 情况下 隐藏 窗口 | 更新日期: 2023-09-27 18:33:52

我正在尝试用 C# 编写一个小工具(称为 StartProcess.exe ),它允许我在不显示 cmd 窗口的情况下执行批处理文件。它使用以下代码(摘自 Main()):

        Process process = new Process();
        // Stop the process from opening a new window
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = true;
        // Setup executable and parameters
        process.StartInfo.FileName = args[0];
        // Go
        process.Start();

不幸的是,这不能按预期工作。当我尝试在桌面上的快捷方式中使用该工具执行尝试启动记事本的小批量文件 ( test.bat) 时,没有任何反应。当我尝试在cmd提示符下StartProcess notepad时,它可以工作。

有没有人知道或有根据的猜测可能导致这种行为的原因?

在隐藏窗口的情况下从 c# 执行批处理文件时,批处理文件执行的程序将不会启动

我自己找到了解决方案。我的工具在process.Start()后直接退出,同时终止其所有子进程。在process.Start()后添加process.WaitForExit()时,它会按预期工作。

注意:从下面的答案中可以看出,这似乎只有在编译为"Windows 应用程序"时才需要。

    Process process = new Process();
    // Stop the process from opening a new window
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    // Setup executable and parameters
    process.StartInfo.FileName = args[0];
    // Go
    process.Start();
    process.WaitForExit();

当使用"控制台应用程序"和"Windows 应用程序"时,使用 DotNet 4 客户端配置文件时,这对我来说非常有效。

Process process = new Process();
// Stop the process from opening a new window
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
// Setup executable and parameters
process.StartInfo.FileName = "batch.bat";
// Go
process.Start();

其中 batch.bat 在我的程序的同一文件夹中,只包含一行:

notepad

当我的程序结束时,记事本仍然打开...

如果将应用程序从"控制台应用程序"更改为"Windows应用程序",则上述代码似乎不起作用。但是如果你添加 Thread.Sleep(1000);最后,在过程之后。Start();,它按预期工作。Nopepad被打开,程序完成。