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

时间:2014-12-10 09:50:54

标签: c# windows batch-file cmd

我正在尝试在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时,它可以正常工作。

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

2 个答案:

答案 0 :(得分:1)

使用“控制台应用程序”和“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);最后,在process.Start();之后,它按预期工作。 Nopepad打开,程序结束。

答案 1 :(得分:1)

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

注意:正如您从下面的答案中看到的那样,只有在编译为“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();