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

C#在同一进程中对批处理和应用程序进行排队,c#,batch-file,process,C#,Batch File,Process,我需要实现以下目标:在一个流程中调用一些我一无所知的第三方bat/cmd文件,然后在同一流程中启动另一个应用程序(可能已经设置了一些环境变量)。在批处理执行之后,我还需要计算一些东西 到目前为止,使用process RedirectStandardInput,我能够在同一进程中对多个命令进行排队: [...] cmdProcess.StartInfo.FileName = "cmd.exe"; cmdProcess.StartInfo.Arguments = ""; cmdProcess.Sta

我需要实现以下目标:在一个流程中调用一些我一无所知的第三方bat/cmd文件,然后在同一流程中启动另一个应用程序(可能已经设置了一些环境变量)。在批处理执行之后,我还需要计算一些东西

到目前为止,使用process 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关闭时执行的,因此我必须找到一种适当的方法来监视batch命令的结束


非常感谢你的帮助

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

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

例如:

a、 蝙蝠:

set myVariable=c:\file.txt
b、 蝙蝠:

echo %myVariable%
c、 蝙蝠:

call a.bat
call b.bat
notepad.exe %myVariable%
它将在相同的上下文中运行批处理文件和程序,从而保留envvars

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

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

?好的,我可以使用WaitForExit等待批处理过程的结束,读取env变量集(如果有的话),然后使用最终的目标应用程序启动一个新过程,并使用新变量集。我确实希望有更优雅的东西存在:(如果你知道一些关于输出的信息,你可以连接到
进程中。OutputDataReceived
并测试你在那里得到的数据,直到它成为预期的最后一段数据。我不知道。但是,如果第三方接受这一点,这可能是一种选择。我想补充一点:如果你不知道,你应该能够将调用打包到批处理文件中,which将输出您想要的内容。嗯,这似乎是将n个脚本排队的最佳方式。感谢您的快速回答。