启动命令行窗口并在其中运行命令

12

我需要使用一些参数启动命令行窗口,并在其中运行更多的命令。

例如,启动一个 test.cmd 并运行 mkdir。

我可以使用 ProcessStartInfo 启动 test.cmd,但我不确定如何运行进一步的命令。我能否向 test.cmd 进程传递进一步的参数?

我该怎么做呢?

无法添加评论到答案...所以写在这里。

Andrea,这就是我正在寻找的内容。然而,上面的代码对我不起作用。

我正在启动一个 test.cmd,它是一个新的命令环境(类似于 razzle 构建环境),我需要运行更多的命令。

psi.FileName = @"c:\test.cmd";
psi.Arguments = @"arg0 arg1 arg2";

psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.CreateNoWindow = true;
psi.UseShellExecute = false;

Process p = new Process();
p.StartInfo = psi;
p.Start();
p.StandardInput.WriteLine(@"dir>c:\results.txt");
p.StandardInput.WriteLine(@"dir>c:\results2.txt"); 

我认为你需要像我的代码一样保留psi.FileName和psi.Arguments,只需执行p.StandardInput.WriteLine(@"c:\test.cmd arg0 arg1 arg2")即可。 - Andrea Parodi
谢谢,我尝试了一下,它起作用了。然而,我现在正在尝试读取控制台日志,但它没有返回我需要的输出。以下是我的完整代码以供澄清。我期望得到的是command123的输出。 - user393148
Process p = new Process(); p.StartInfo = psi; p.Start(); p.StandardInput.WriteLine(@"c:\test.cmd arg1 arg2 && cd /d c:\testdir\sample && command123 /c"); p.StandardInput.WriteLine(@"exit");string output = p.StandardOutput.ReadToEnd();p.WaitForExit(); - user393148
我得到的输出是在控制台中运行上述命令。如何获取command123的输出? - user393148
4个回答

13

您可以使用进程标准输入向cmd.exe发送进一步的命令。您必须通过以下方式重定向它:

var startInfo = new ProcessStartInfo
                    {
                        FileName = "cmd.exe",
                        RedirectStandardInput = true,
                        RedirectStandardOutput = true,
                        UseShellExecute = false,
                        CreateNoWindow = true
                    };

var process = new Process {StartInfo = startInfo};

process.Start();
process.StandardInput.WriteLine(@"dir>c:\results.txt");
process.StandardInput.WriteLine(@"dir>c:\results2.txt");
process.StandardInput.WriteLine("exit");

process.WaitForExit();

记得把 "exit" 写作最后一个命令,否则cmd进程将无法正确终止...


2
/c 参数用于 cmd 命令。
ProcessStartInfo start = new ProcessStartInfo("cmd.exe", "/c pause");
Process.Start(start);

pause 只是一个可以运行的示例)

但是对于创建目录以及大多数其他文件操作,您可以直接在 C# 中完成。

System.IO.Directory.CreateDirectory(@"c:\foo\bar");

从C#启动cmd只有在您有一些大型批处理文件并且不想在C#中复制时才有用。


0
你想要实现什么?你真的需要打开一个命令窗口,还是只需要创建一个目录,例如? mkdir 是一个 Windows 可执行文件 - 你可以像启动 cmd 一样启动这个程序 - 没有必要先启动一个命令窗口进程。
你也可以创建一个包含所有要运行的命令的批处理文件,然后使用你已经在使用的 Process 和 ProcessStartInfo 类简单地启动它。

Winston,mkdir只是一个例子。我正在启动一个新的cmd环境(基本上存储了一组预设的环境变量),并且我想运行更多的命令。Andrea的答案应该可以解决我的问题。但似乎对我不起作用。 - user393148

0

为什么这个不起作用?

    var startInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        UseShellExecute = false,
        CreateNoWindow = false
    };

    var process = new Process { StartInfo = startInfo };

    process.Start();
    process.StandardInput.WriteLine(@" dir");
    process.WaitForExit();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接