C#在同一进程中排队批处理和应用程序

时间:2014-09-10 11:01:52

标签: c# batch-file process

我需要实现以下功能:调用一些第三方bat / cmd文件我在进程中什么都不知道,然后在同一个进程中启动另一个应用程序(可能已经设置了一些env变量)。我还需要在批处理执行后计算一些东西。

到目前为止,使用进程RedirectStandardInput,我能够在同一进程中排队几个命令:

[...]
cmdProcess.StartInfo.FileName = "cmd.exe";
cmdProcess.StartInfo.Arguments = "";
cmdProcess.Start();

using (var sw = cmdProcess.StandardInput)
{
    if (sw.BaseStream.CanWrite)
    {
        sw.WriteLine(FirstBatFile);
        SomeAction();
        sw.WriteLine(SecondApplication);
    }
}

我的问题是:我必须确保在我的SomeAction()方法中执行任何操作之前以及在调用最终应用程序之前完成第一个bat命令。我真的不知道如何实现这一目标。当StandardInput关闭时,所有内容都会执行,因此我必须找到一种正确的方法来监视批处理命令的结束。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您需要在同一控制台上下文中运行所有批处理文件和程序,以保留批处理脚本设置的环境值。

另一种可能的方法是另一个批处理文件。

例如:

a.bat:

set myVariable=c:\file.txt

b.bat:

echo %myVariable%

C.BAT:

call a.bat
call b.bat
notepad.exe %myVariable%

它将在相同的上下文中运行批处理文件和程序,从而保留envvars。

或者,您可以强制它进入cmd的命令行。但是,如果envvar中的文件路径被引号字符包围,它将把它与当前工作目录合并。

cmd /c "call a.bat & call b.bat & notepad.exe %myVariable%"