2010-09-01 124 views
10

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

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

我认为你必须要离开PSI .FileName和psi.Arguments在我的代码中,只是做一个p.StandardInput.WriteLine(@“c:\ test.cmd arg0 arg1 arg2”); – 2010-09-01 18:00:11

+0

谢谢我试过了,它工作。但是,有了这个我试图读取控制台日志,它不会返回我需要的输出。这是我的完整代码,以供澄清。 我期待的是command123的输出。 – user393148 2010-09-01 19:58:03

+0

进程p = new Process(); p.StartInfo = psi; p.Start(); p.StandardInput.WriteLine(@“c:\ test。CMD ARG1 ARG2 &&坎德拉/ DC:\ TESTDIR \样品&& command123/C “); p.StandardInput.WriteLine(@” 退出“); 串输出= p.StandardOutput.ReadToEnd(); p.WaitForExit (); – user393148 2010-09-01 19:59:12

回答

11

您可以使用进程 标准输入向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(); 

记得写“退出”作为您的最后一个命令,否则CMD过程不正确终止......

+0

添加我对问题部分的评论。 – user393148 2010-09-01 17:41:29

0

你想达到什么目的?你是否真的需要打开一个命令窗口,或者你需要简单地创建一个目录,例如?

mkdir是一个Windows可执行文件 - 您可以像启动相同的方式启动该程序cmd - 无需首先启动命令窗口过程。

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

+0

Winston,mkdir只是一个例子,我启动了一个新的cmd环境(基本上存储一个预设的env变量),我想运行进一步的命令。Andrea的答案应该可以解决我的问题,但似乎没有为我工作。 – user393148 2010-09-01 17:24:31

1

/c参数为cmd

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

pause只是你可以运行的代码示例)

但对于创建一个目录,你可以做到这一点,从C#大多数其他文件操作直接

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

启动CMD只有当你有一些你不想在c#中复制的大蝙蝠文件时,才有用c#。

1

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