新手,如何启动这个功能

Newbie, howto to start this function

请原谅这个愚蠢的问题,我是 c# 的新手,我的 Vb 已经很多年没动过了..

基于本文:Process Start

这里是代码:

 public static int Run(Action<string> output, TextReader input, string exe, params string[] args)
  {
     if (String.IsNullOrEmpty(exe))
        throw new FileNotFoundException();
     if (output == null)
        throw new ArgumentNullException("output");

     ProcessStartInfo psi = new ProcessStartInfo();
     psi.UseShellExecute = false;
     psi.RedirectStandardError = true;
     psi.RedirectStandardOutput = true;
     psi.RedirectStandardInput = true;
     psi.WindowStyle = ProcessWindowStyle.Hidden;
     psi.CreateNoWindow = true;
     psi.ErrorDialog = false;
     psi.WorkingDirectory = Environment.CurrentDirectory;
     psi.FileName = FindExePath(exe); //see http://csharptest.net/?p=526
     psi.Arguments = EscapeArguments(args); // see http://csharptest.net/?p=529

     using (Process process = Process.Start(psi))
     using (ManualResetEvent mreOut = new ManualResetEvent(false),
     mreErr = new ManualResetEvent(false))
     {
        process.OutputDataReceived += (o, e) => { if (e.Data == null) mreOut.Set(); else output(e.Data); };
        process.BeginOutputReadLine();
        process.ErrorDataReceived += (o, e) => { if (e.Data == null) mreErr.Set(); else output(e.Data); };
        process.BeginErrorReadLine();

        string line;
        while (input != null && null != (line = input.ReadLine()))
           process.StandardInput.WriteLine(line);

        process.StandardInput.Close();
        process.WaitForExit();

        mreOut.WaitOne();
        mreErr.WaitOne();
        return process.ExitCode;
     }
  }

...我该如何调用该函数?

我修改了这个函数:

public static int Run(Action<string> output, TextReader input, string exe, string args)

...因为我已经知道 exe 路径并且我想直接将 args 作为直接字符串传递,但我不知道如何使用输出和输入变量。

顺便说一句,我了解功能,但如何调用它? 澄清请帮我填写?这里:

Run(???, ???, "console.exe", " -someargs");

一个代码示例将不胜感激...再次为我愚蠢的问题和我糟糕的英语语言感到抱歉。

此致

根据我的发现,

Action<String> 

可以找到 - What is Action<string>?

Action<String> print = (x) => Console.WriteLine(x);

List<String> names = new List<String> { "pierre", "paul", "jacques" };
names.ForEach(print);

至于TextReader,貌似需要读取一个文件,具体操作方法你可以看看-http://www.dotnetperls.com/textreader

using (TextReader reader = File.OpenText(@"C:\perl.txt"))
{
    public static int Run(print, reader, "console.exe", " -someargs")
}

我不能告诉你用什么填充对象的属性,因为我不知道你想要实现什么,但缺少的参数基本上是两个对象,你需要创建这些并传递他们进来。我提供的链接应该给你足够的信息,告诉你如何去创建它们。

假设您对 exe 产生的输出不感兴趣,并且不想向进程中输入任何数据,您可以这样调用该函数:

Run((outMsg) => {}, null, "console.exe", " -someargs");

说明

第一个参数是 Action<string>,这意味着它需要一个带有一个字符串参数的函数。从标准输出或标准错误上的进程接收的每个数据都传递给此函数。 在我上面的示例中,我只是插入了一个接受一个参数但什么都不做的 lambda 表达式。

第二个参数是一个 TextReader 实例,它似乎是可选的,因此在不需要时可以作为 null 传递。 如果设置 TextReader 的内容写入进程的标准输入。

好吧,我找到了解决方案而不是 post 在这里为其他人提供(希望我可以,否则请删除它..)

获取输出的方法很简单:

基于此代码:

        public static int Run(Action<string> output, string exe, string args)
        {
            if (String.IsNullOrEmpty(exe))
                throw new FileNotFoundException();
            if (output == null)
                throw new ArgumentNullException("output");

            ProcessStartInfo psi = new ProcessStartInfo();
            psi.UseShellExecute = false;
            psi.RedirectStandardError = true;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardInput = true;
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            psi.CreateNoWindow = true;
            psi.ErrorDialog = false;
            psi.WorkingDirectory = Environment.CurrentDirectory;
            psi.FileName = FindExePath("cdrecord.exe"); //see http://csharptest.net/?p=526
            psi.Arguments = " -scanbus -v"; // see http://csharptest.net/?p=529

            using (Process process = Process.Start(psi))
            using (ManualResetEvent mreOut = new ManualResetEvent(false),
            mreErr = new ManualResetEvent(false))
            {
                process.OutputDataReceived += (o, e) => { if (e.Data == null) mreOut.Set(); else output(e.Data); };
                process.BeginOutputReadLine();
                
                process.ErrorDataReceived += (o, e) => { if (e.Data == null) mreErr.Set(); else output(e.Data); };
                process.BeginErrorReadLine();

                output = s => ShowWindowsMessage(s);

                process.StandardInput.Close();
                process.WaitForExit();

                mreOut.WaitOne();
                mreErr.WaitOne();

                
                return process.ExitCode;
            }
        }

        public static string FindExePath(string exe)
        {
            exe = Environment.ExpandEnvironmentVariables(exe);
            if (!File.Exists(exe))
            {
                if (Path.GetDirectoryName(exe) == String.Empty)
                {
                    foreach (string test in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(';'))
                    {
                        string path = test.Trim();
                        if (!String.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, exe)))
                            return Path.GetFullPath(path);
                    }
                }
                throw new FileNotFoundException(new FileNotFoundException().Message, exe);
            }
            return Path.GetFullPath(exe);
        }
    private static void ShowWindowsMessage(string message)
    {
        MessageBox.Show(message);
    }

它能够启动一个进程并读取它的输出,可以用以下方式调用它:

        private void lbl_devices_Click(object sender, EventArgs e)
        {
           int h;
           h = Run((output) => { }, "cdrecord.exe", "-scanbus -v");

        }

我为使用 Action 添加的代码是:

output = s => ShowWindowsMessage(s);

希望这能帮助其他人,比如 Sythnet P 和 Gargo 帮助了我,非常感谢大家!!!!咔嚓咔嚓