如何将一系列命令发送到命令窗口进程?
我们的网络路径上有一些命令(批处理文件/可执行文件),我们必须调用它来初始化该命令窗口的“开发环境”。 它设置了一些环境变量,向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方法,可以是实例,也可以是静态方法