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


我需要用一些参数启动命令窗口并在里面运行更多命令。

例如,启动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"); 

10607
2017-09-01 07:53


起源

我想你必须像我的代码一样留下psi.FileName和psi.Arguments,只需要做一个p.StandardInput.WriteLine(@“c:\ test.cmd arg0 arg1 arg2”); - Andrea Parodi
谢谢我尝试了它,它的工作原理。但是,有了这个,我试图读取控制台日志,它不会返回我需要的输出。这是我完整的澄清代码。我期待的是command123的输出。 - user393148
过程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(@ “退出”); string output = p.StandardOutput.ReadToEnd(); p.WaitForExit(); - user393148
我得到的输出是在控制台中运行的上述命令。如何获得command123的输出? - user393148


答案:


您可以使用该过程将更多命令发送到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进程无法正确终止...


12
2017-09-01 09:25



我在问题部分添加了评论。 - user393148
这个答案很难找到,每个人都在说使用allocConsole()。对我来说这看起来最美。 - blackholeearth0_gmail


/c 参数来 cmd

ProcessStartInfo start = new ProcessStartInfo("cmd.exe", "/c pause");
Process.Start(start);

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

但是对于创建目录,您可以直接从c#执行该操作和大多数其他文件操作

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

只有当您有一些不想在c#中复制的大型文件时,才能从c#启动cmd。


1
2017-09-01 07:59





也许 这个 帖子很有帮助。你是这个意思吗?


1
2017-09-01 07:59





你想要达到什么目的?你真的需要打开命令窗口,还是只需要创建一个目录,例如?

mkdir 是一个Windows可执行文件 - 您可以像开始一样启动此程序 cmd  - 首先不需要启动命令窗口进程。

您还可以创建一个包含要运行的所有命令的批处理文件,然后使用您已经使用的Process和ProcessStartInfo类来启动它。


0
2017-09-01 07:58



温斯顿,mkdir只是一个例子。我正在启动一个新的cmd环境(基本上存储一个预设的env变量),我想运行更多的命令。安德里亚的回答应该可以解决我的问题。但似乎并没有为我工作。 - user393148