新手,如何启动这个功能
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 帮助了我,非常感谢大家!!!!咔嚓咔嚓
请原谅这个愚蠢的问题,我是 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 帮助了我,非常感谢大家!!!!咔嚓咔嚓