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

时间:2011-01-25 00:39:45

标签: c# process cmd

我们的网络路径上有一些命令(批处理文件/可执行文件),我们必须调用它来初始化该命令窗口的“开发环境”。它设置了一些环境变量,向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.<strike>Run</strike>Start("cmd.exe","Dowork -arguments");直接执行此操作,它将无法运行。

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

2 个答案:

答案 0 :(得分:15)

正如@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);


更多信息

多命令批处理文件的示例

dir /O
pause
dir
pause

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

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

代码受到类似问题的启发:Execute multiple command lines with the same process using 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流。

答案 1 :(得分:0)

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