运行 带参数的 exe 不工作
Running exe with parameters doesn't work
var p = Process.Start(@"c:\PsTools\PsExec.exe", @"C:\Windows\System32\notepad.exe");
var err = p.StandardError.ReadToEnd();
var msg = p.StandardOutput.ReadToEnd();
lblStatusResponse.Text = "Err: " + err + "Msg: " + msg;
为什么我的代码不起作用?
我收到错误:
System.InvalidOperationException: StandardError has not been redirected.
但是当我添加以下内容时:
p.StartInfo.RedirectStandardError = true;
var p = Process.Start(@"c:\PsTools\PsExec.exe", @"C:\Windows\System32\notepad.exe");)
它仍然得到同样的错误。
主要问题是我想执行带参数的 exe,但我无法让它工作。
以下代码生成一个新的 p
,这将忽略您在上一个实例中更改的设置:
var p = Process.Start(@"c:\PsTools\PsExec.exe", @"C:\Windows\System32\notepad.exe");)
所以你是否像这样初始化p
并不重要
p.StartInfo.RedirectStandardError = true;
与否。
你需要做什么
您需要创建一个 ProcessStartInfo
对象,对其进行配置,然后将其传递给 Process.Start
。
ProcessStartInfo p = new ProcessStartInfo(@"c:\PsTools\PsExec.exe", @"C:\Windows\System32\notepad.exe");
p.UseShellExecute = false;
p.RedirectStandardError = true;
p.RedirectStandardOutput = true;
Process proc = Process.Start(p);
var err = proc.StandardError.ReadToEnd();
var msg = proc.StandardOutput.ReadToEnd();
摘自 MSDN:https://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(v=vs.110).aspx
The StandardOutput stream has not been defined for redirection; ensure ProcessStartInfo.RedirectStandardOutput is set to true and ProcessStartInfo.UseShellExecute is set to false.
所以记得按照 MS 的指示设置这些标志。
我知道这与您拥有的代码不同,但这是我拥有的唯一可用代码,它将 运行 外部 command/process 在 C# 中 return 所有它 output/errors 到应用程序 main window
public void Processing()
{
//Create and start the ffmpeg process
System.Diagnostics.ProcessStartInfo psi = new ProcessStartInfo("ffmpeg")
{ // this is fully command argument you can make it according to user input
Arguments = "-y -i '/mnt/Disk2/Video/Antina03.jpg' pp.mp4 ",
RedirectStandardOutput = true,
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
UseShellExecute = false,
RedirectStandardError=true,
RedirectStandardInput=true
};
System.Diagnostics.Process ischk;
ischk = System.Diagnostics.Process.Start(psi);
ischk.WaitForExit();
////Create a streamreader to capture the output of ischk
System.IO.StreamReader ischkout = ischk.StandardOutput;
ischk.WaitForExit();
if (ischk.HasExited) // this condition very important to make asynchronous output
{
string output = ischkout.ReadToEnd();
out0 = output;
}
/// in case you got error message
System.IO.StreamReader iserror = ischk.StandardError;
ischk.WaitForExit();
if (ischk.HasExited)
{
string output = iserror.ReadToEnd();
out0 = output;
}
}
如果你想运行这个过程只调用函数Processing()
顺便说一句out0
是全局变量所以它可以用完函数。
我正在使用 MonoDevlop "C# devloping tool on Linux " 并且我以这种方式获得输出:-
public MainWindow() : base(Gtk.WindowType.Toplevel)
{
Build();
Processing();
textview2.Buffer.Text = out0;
}
Process proc = new Process();
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.Arguments = "/C " + command; //Enter your own command
proc.Start();
string output =proc.StandardOutput.ReadToEnd();
var p = Process.Start(@"c:\PsTools\PsExec.exe", @"C:\Windows\System32\notepad.exe");
var err = p.StandardError.ReadToEnd();
var msg = p.StandardOutput.ReadToEnd();
lblStatusResponse.Text = "Err: " + err + "Msg: " + msg;
为什么我的代码不起作用?
我收到错误:
System.InvalidOperationException: StandardError has not been redirected.
但是当我添加以下内容时:
p.StartInfo.RedirectStandardError = true;
var p = Process.Start(@"c:\PsTools\PsExec.exe", @"C:\Windows\System32\notepad.exe");)
它仍然得到同样的错误。
主要问题是我想执行带参数的 exe,但我无法让它工作。
以下代码生成一个新的 p
,这将忽略您在上一个实例中更改的设置:
var p = Process.Start(@"c:\PsTools\PsExec.exe", @"C:\Windows\System32\notepad.exe");)
所以你是否像这样初始化p
并不重要
p.StartInfo.RedirectStandardError = true;
与否。
你需要做什么
您需要创建一个 ProcessStartInfo
对象,对其进行配置,然后将其传递给 Process.Start
。
ProcessStartInfo p = new ProcessStartInfo(@"c:\PsTools\PsExec.exe", @"C:\Windows\System32\notepad.exe");
p.UseShellExecute = false;
p.RedirectStandardError = true;
p.RedirectStandardOutput = true;
Process proc = Process.Start(p);
var err = proc.StandardError.ReadToEnd();
var msg = proc.StandardOutput.ReadToEnd();
摘自 MSDN:https://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(v=vs.110).aspx
The StandardOutput stream has not been defined for redirection; ensure ProcessStartInfo.RedirectStandardOutput is set to true and ProcessStartInfo.UseShellExecute is set to false.
所以记得按照 MS 的指示设置这些标志。
我知道这与您拥有的代码不同,但这是我拥有的唯一可用代码,它将 运行 外部 command/process 在 C# 中 return 所有它 output/errors 到应用程序 main window
public void Processing()
{
//Create and start the ffmpeg process
System.Diagnostics.ProcessStartInfo psi = new ProcessStartInfo("ffmpeg")
{ // this is fully command argument you can make it according to user input
Arguments = "-y -i '/mnt/Disk2/Video/Antina03.jpg' pp.mp4 ",
RedirectStandardOutput = true,
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
UseShellExecute = false,
RedirectStandardError=true,
RedirectStandardInput=true
};
System.Diagnostics.Process ischk;
ischk = System.Diagnostics.Process.Start(psi);
ischk.WaitForExit();
////Create a streamreader to capture the output of ischk
System.IO.StreamReader ischkout = ischk.StandardOutput;
ischk.WaitForExit();
if (ischk.HasExited) // this condition very important to make asynchronous output
{
string output = ischkout.ReadToEnd();
out0 = output;
}
/// in case you got error message
System.IO.StreamReader iserror = ischk.StandardError;
ischk.WaitForExit();
if (ischk.HasExited)
{
string output = iserror.ReadToEnd();
out0 = output;
}
}
如果你想运行这个过程只调用函数Processing()
顺便说一句out0
是全局变量所以它可以用完函数。
我正在使用 MonoDevlop "C# devloping tool on Linux " 并且我以这种方式获得输出:-
public MainWindow() : base(Gtk.WindowType.Toplevel)
{
Build();
Processing();
textview2.Buffer.Text = out0;
}
Process proc = new Process();
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.Arguments = "/C " + command; //Enter your own command
proc.Start();
string output =proc.StandardOutput.ReadToEnd();