使用c#在提升的命令提示符中顺序编写和执行多行

时间:2014-08-11 17:17:24

标签: c# .net cmd

我是C#的新手,我有3个命令(command2,command3和command4)我需要在提升的命令提示符下执行,我也希望在执行过程中查看执行过程。目前,问题是下面的代码只是打开提升的命令提示符而不执行命令。如果错误,我也会寻求更好的解释。

我的代码和解释/理解每一行基于类似案例的评论:ConsoleApp1

class Program
{
    static void Main(string[] args)
    {
        string command2 = @"netsh wlan"; 
        string command3 = @" set hostednetwork mode=true ssid=egghead key=beanhead keyusage=persistent";
        string command4 = @" start hostednetwork";
        string maincomm = command2.Replace(@"\", @"\\") + " " + command3.Replace(@"\", @"\\") ; //I merged commands 2 and 3

        ProcessStartInfo newstartInfo = new ProcessStartInfo();
        newstartInfo.FileName = "cmd"; //Intend to open cmd. without this the newProcess hits an error saying - Cannot run process without a filename.
        newstartInfo.Verb = "runas"; //Opens cmd in elevated mode
        newstartInfo.Arguments = maincomm; //I intend to pass in the merged commands.
        newstartInfo.UseShellExecute = true; //
        newstartInfo.CreateNoWindow = true; // I intend to see the cmd window 

        Process newProcess = new Process(); //

        newProcess.StartInfo = newstartInfo; //Assigns my newstartInfo to the process object that will execute
        newProcess.Start(); // Begin process and Execute newstartInfo

        newProcess.StartInfo.Arguments = command4; //I intend to overwrite the initial command argument hereby passing the another command to execute.
        newProcess.WaitForExit(); //  
    }
}

1 个答案:

答案 0 :(得分:1)

这就是我为克服挑战所做的工作,它给了我我想要的东西。我修改了我的代码,使用System.IO直接写入提升的命令提示符。

            ProcessStartInfo newstartInfo = new ProcessStartInfo();
            newstartInfo.FileName = "cmd";
            newstartInfo.Verb = "runas";
            newstartInfo.RedirectStandardInput = true;
            newstartInfo.UseShellExecute = false; //The Process object must have the UseShellExecute property set to false in order to redirect IO streams.

            Process newProcess = new Process();

            newProcess.StartInfo = newstartInfo;
            newProcess.Start();
            StreamWriter write = newProcess.StandardInput ; //Using the Streamwriter to write to the elevated command prompt.
            write.WriteLine(maincomm); //First command executes in elevated command prompt
            write.WriteLine(command4); //Second command executes and Everything works fine
            newProcess.WaitForExit();

参考:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardinput(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo(v=vs.110).aspx

我认为理解ProcessStartInfo的某些属性可能会让事情变得清晰。

  

动词 - 获取或设置打开FileName属性指定的应用程序或文档时要使用的动词。   + UseShellExecute - 获取或设置一个值,该值指示是否使用操作系统shell来启动进程。   + FileName - 获取或设置要启动的应用程序或文档MSDN Docs

     

当您使用操作系统shell启动进程时,您可以启动任何文档(与具有默认打开操作的可执行文件关联的任何已注册文件类型)并对文件执行操作(如打印),方法是使用Process对象。当UseShellExecute为false时,您只能使用Process对象Documentation from MSDN启动可执行文件。

就我而言,cmd是可执行文件。动词属性是一个回答问题的东西"我应该如何运行我的FileName(对于可执行文件,例如cmd或任何应用程序)?"我回答了这个问题 - " runas"即以administrator运行。当FileName是一个文档(例如`someFile.txt)时,动词回答问题"我该怎么处理答案(动词)可能是什么文件 - "编辑&#34 ;,"打印"等等?"

  

如果在启动进程时应该使用shell,则使用true;如果应该直接从可执行文件创建进程,则返回false。默认值为true MSDN Docs - UserShellInfo

值得注意的另一件事是知道你想要实现的目标。在我的情况下,我希望能够通过可执行文件(cmd提示符)以相同的过程运行命令 - 即启动cmd作为我可以跟踪的过程。