Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向命令窗口进程发送一系列命令?_C#_Process_Cmd - Fatal编程技术网

C# 如何向命令窗口进程发送一系列命令?

C# 如何向命令窗口进程发送一系列命令?,c#,process,cmd,C#,Process,Cmd,我们的网络路径上有一些命令(批处理文件/可执行文件),我们必须调用这些命令来初始化该命令窗口的“开发环境”。它设置了一些环境变量,向路径中添加了一些内容等(然后只有我们键入的任何工作命令才会被识别&我不知道这些初始化命令中包含了什么) 现在我的问题是,我想用C#程序调用一系列“工作命令”,当然,它们只有在初始设置完成后才能工作。我该怎么做?目前,我正在从程序中从头开始创建批处理文件,例如: file.Writeline("InitializationStep1.bat") file.Writel

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

现在我的问题是,我想用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”)执行这个命令它不会运行


如何以更简洁的方式实现这一点,以便只需运行一次初始化命令?(我可以使用所有三个初始值设定项每次运行
cmd.exe
,但它们需要很多时间,所以我只想执行一次)

您提到的Process.run方法,是来自System.Diagnostics命名空间中的Process类吗?好的,进程类型既没有名为Run的静态方法,也没有名为Run的实例方法。如果您还没有使用流程上的Start方法,我会尝试使用instance或static方法,正如@Hakeem所指出的,
System.Diagnostic.Process
没有static
Run
方法。我想你指的是开始的方法。
完成批处理文件的构建后,只需使用以下代码执行它,

请注意,
@
符号必须作为参数字符串的前缀,以便像
\
这样的转义序列字符被视为文本。

替代代码


更多信息

多命令批处理文件示例

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

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

代码的灵感来自以下类似问题:


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

朋友们,很抱歉,我指的是进程。仅启动而不是进程。运行。此外,我想我在解释我的问题时还不够清楚。我知道如何执行这些基本的commands使用Process.Start和ProcessStartInfo。我的问题是,一旦我执行了它,一切都结束了——我想用该进程调用“初始化”批处理文件,然后在同一进程中调用实际的工作命令,因为只有该进程具有正确的环境变量和正确的路径设置我的意思是它不会运行,因为运行该命令的先决条件仅通过调用那些初始值设定项批处理和exe文件在命令提示符中设置。因此,如果直接使用process运行,甚至无法识别该命令的工作。这是控制流吗:1.创建批处理文件(无参数),2.在批处理文件中使用另一个进程中的指定参数执行命令。?如果我不正确,那么确切的控制流是什么?您上面的评论不太准确。嗨,哈基姆,正如我在问题中编辑的,我确实在谈论进程。运行并不能解决我的问题。啊!再次键入。我确实在谈论about“Process.Start”这并不能解决我的问题:(嗨,Devendra,正如问题中编辑的,Process.Run是一个打字错误,它是Process.Start。我的问题不是只运行一个命令或批处理文件。问题是如何在一次创建的同一个cmd窗口中运行一系列命令。你知道怎么做吗?@piyus,你可以通过编程在单独的行上使用每个命令创建批处理文件。我知道我编辑了答案,添加了一个例子。嗨,德文德拉,这就是我最初所做的(也很有效),但我希望在同一个命令窗口进程中执行一系列步骤的方法更简洁。@Piyush,批处理文件是执行一系列命令的方法。但您可以将所有命令放在一个批处理文件中,需要一个调用初始值设定项命令。另一种方法是与子进程(cmd.exe)通信使用IPC,但这会使现有的解决方案复杂化。然而,你可以看看:还有一个类似的问题:据我所知,IPC只有在两个程序都是由我们编写的情况下才有用(或者我们知道另一个程序的代码)。我不知道如何与cmd.exe通信。第二个链接与我的问题完全无关。我最初问题的实质实际上非常简短:“如何在不使用批处理文件的情况下将一系列命令发送到单个命令提示符进程,我一直在这样做。”
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
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;
}