【问题标题】:How to send series of commands to a command window process?如何将一系列命令发送到命令窗口进程?
【发布时间】:2011-06-14 21:40:09
【问题描述】:

我们的网络路径上有一些命令(批处理文件/可执行文件),我们必须调用它们来为该命令窗口初始化我们的“开发环境”。它设置一些环境变量,向 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,但它们需要很长时间,所以我只想执行一次)

【问题讨论】:

  • 嗨朋友们,很抱歉造成混乱,我的意思是 Process.Start 只是 Process.Start 而不是 Process.Run。另外,我想我在解释我的问题时不够清楚。我也知道如何使用 Process.Start 和 ProcessStartInfo 执行这些基本命令。我的问题是,一旦我执行它,一切都结束了——虽然我想用那个进程调用“初始化”批处理文件,然后在同一个进程中调用实际的工作命令,因为只有那个具有正确的环境变量和正确的路径集.
  • 另外,“它不会运行”我的意思是它不会运行,因为运行命令的先决条件是通过调用那些初始化程序批处理和 exe 文件在命令提示符中设置的。因此,如果我直接使用进程运行,甚至无法识别此命令 Dowork。
  • 这是控制流程吗:1.创建批处理文件(不带参数),2.在另一个进程中使用指定参数执行批处理文件中的命令。?如果我不正确,那么确切的控制流程是什么?你上面的cmets不是很精确。

标签: c# process cmd


【解决方案1】:

正如@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 方法执行。在这种情况下,您可以在批处理文件本身中使用命令指定参数(在上面的示例中,为dir 命令指定了/O 选项。
我想您已经完成了批处理文件创建部分,现在只需将参数附加到批处理文件中的命令。

将输入重定向到进程
由于您想向同一个 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;
}

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

【讨论】:

  • 嗨 Devendra,正如在问题中编辑的那样,Process.Run 是一个错字,它是 Process.Start。我的问题不只是运行一个命令或批处理文件。它是如何在创建一次的同一个 cmd 窗口中运行一系列命令。你知道怎么做吗?
  • @Piyush,您可以通过编程方式创建一个批处理文件,其中每个命令位于单独的行上。我已编辑答案以添加示例。
  • 嗨 Devendra,这就是我最初正在做的事情(它也可以正常工作),但我想要一种更简洁的方法,在同一个命令窗口进程中执行一系列步骤。
  • @Piyush,批处理文件是执行一系列命令的方式。但是您可以将所有命令放在一个需要单个调用初始化程序命令的批处理文件中。另一种方法是使用 IPC 与子进程 (cmd.exe) 进行通信,但这会使现有解决方案复杂化。不过,您可以查看:stackoverflow.com/questions/50153/… 和类似的问题:stackoverflow.com/questions/1515965/…
  • 据我所知,只有当两个通信程序都是我们编写的(或者我们知道另一个程序的代码)时,IPC才有用。我不知道如何与 cmd.exe 通信。第二个链接与我的问题完全无关。我最初的问题的本质实际上很短:“如何在不使用批处理文件的情况下将一系列命令发送到 SINGLE 命令提示符进程,无论如何我都在这样做。”
【解决方案2】:

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

【讨论】:

  • 嗨哈基姆,我也在问题中进行了编辑,我确实在谈论 Process.Run 但这并不能解决我的问题。
  • 啊!再次键入。我确实在谈论“Process.Start”,但这并不能解决我的问题:(
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2010-09-29
  • 1970-01-01
相关资源
最近更新 更多