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

Piy*_*oni 9 c# cmd process

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

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

file.Writeline("InitializationStep1.bat")
file.Writeline("InitializeStep2.exe")
file.Writeline("InitializeStep3.exe")
Run Code Online (Sandbox Code Playgroud)

然后是实际的命令

file.Writeline("Dowork -arguments -flags -blah -blah")
file.Writeline("DoMoreWork -arguments -flags -blah -blah")
Run Code Online (Sandbox Code Playgroud)

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

现在,如果我使用Process.<strike>Run</strike>Start("cmd.exe","Dowork -arguments");它直接执行它将无法运行.

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

Dev*_*van 15

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

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

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

替代代码

Process.Start(batchFilePath, @"-a arg1 -b arg2");
Run Code Online (Sandbox Code Playgroud)

要么

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


更多信息

多命令批处理文件的示例

dir /O
pause
dir
pause
Run Code Online (Sandbox Code Playgroud)

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

重定向输入到程序
既然你要多个命令发送到同一个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;
}
Run Code Online (Sandbox Code Playgroud)

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