我需要实现以下功能:调用一些第三方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关闭时,所有内容都会执行,因此我必须找到一种正确的方法来监视批处理命令的结束。
非常感谢你的帮助!
答案 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%"