如何将一系列命令发送到命令窗口进程?

我们的网络路径上有一些命令(批处理文件/可执行文件),我们必须调用它来初始化该命令窗口的“开发环境”。 它设置了一些环境变量,向Path添加了东西等等。(然后,只有我们输入的任何工作命令都会被识别,我不知道那些初始化命令内部的内容)

现在我的问题是,我想使用C#程序调用一系列“工作命令”,当然,只有初始设置完成后它们才能工作。 我怎样才能做到这一点? 目前,我正在从程序中创建一个批处理文件,例如:

file.Writeline("InitializationStep1.bat") file.Writeline("InitializeStep2.exe") file.Writeline("InitializeStep3.exe") 

然后是实际的命令

 file.Writeline("Dowork -arguments -flags -blah -blah") file.Writeline("DoMoreWork -arguments -flags -blah -blah") 

然后最后关闭文件编写器,并运行此批处理文件。

现在如果我使用Process.RunStart("cmd.exe","Dowork -arguments");直接执行它Process.RunStart("cmd.exe","Dowork -arguments"); 它不会运行。

如何以更干净的方式实现这一点,以便我只需要运行一次初始化命令? (我每次使用所有三个初始化程序都可以运行cmd.exe ,但是它们需要花费很多时间,所以我只想做一次)

正如@Hakeem指出的那样, System.Diagnostic.Process没有静态的Run方法。 我想你指的是Start方法。
完成批处理文件的构建后,只需使用以下代码执行它,

 Process p = new Process(); p.StartInfo.FileName = batchFilePath; p.StartInfo.Arguments = @"-a arg1 -b arg2"; p.Start(); 

请注意, @符号必须以参数字符串作为前缀,以便将\等转义序列字符视为文字。

替代代码

 Process.Start(batchFilePath, @"-a arg1 -b arg2"); 

要么

 ProcessStartInfo processStartInfo = new ProcessStartInfo(); processStartInfo.FileName = batchFilePath; processStartInfo.Arguments = @"-a arg1 -b arg2"; Process.Start(processStartInfo); 

更多信息

  • Process.Start方法

多命令批处理文件的示例

 dir /O pause dir pause 

将此文件另存为.bat,然后使用Start方法执行。 在这种情况下,您可以在批处理文件本身中使用该命令指定参数(在上面的示例中,为dir命令指定了/O选项。
我想你已经完成了批处理文件创建部分,现在只需将参数附加到批处理文件中的命令。

将输入重定向到流程
由于您希望将多个命令发送到同一个cmd进程,因此您可以将进程的标准输入重定向到从程序而不是键盘获取输入。

代码的灵感来自于类似的问题: 使用C#使用相同的进程执行多个命令行

 private string ProcessRunner() { ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe"); processStartInfo.RedirectStandardInput = true; processStartInfo.RedirectStandardOutput = true; processStartInfo.UseShellExecute = false; Process process = Process.Start(processStartInfo); if (process != null) { process.StandardInput.WriteLine("dir"); process.StandardInput.WriteLine("mkdir testDir"); process.StandardInput.WriteLine("echo hello"); //process.StandardInput.WriteLine("yourCommand.exe arg1 arg2"); process.StandardInput.Close(); // line added to stop process from hanging on ReadToEnd() string outputString = process.StandardOutput.ReadToEnd(); return outputString; } return string.Empty; } 

该方法返回命令执行的输出。 以类似的方式,您还可以重定向并读取流程的StandardOuput流。

您提到的Process.Run方法是来自System.Diagnostics命名空间中的Process类吗? AFAIK,Process类型没有名为Run的静态方法或实例方法。 如果您还没有尝试使用Process上的Start方法,可以是实例,也可以是静态方法