- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果你想启动另一个进程并等待(超时)完成你可以使用 the following (from MSDN) .
//Set a time-out value.
int timeOut=5000;
//Get path to system folder.
string sysFolder=
Environment.GetFolderPath(Environment.SpecialFolder.System);
//Create a new process info structure.
ProcessStartInfo pInfo = new ProcessStartInfo();
//Set file name to open.
pInfo.FileName = sysFolder + @"\eula.txt";
//Start the process.
Process p = Process.Start(pInfo);
//Wait for window to finish loading.
p.WaitForInputIdle();
//Wait for the process to exit or time out.
p.WaitForExit(timeOut);
//Check to see if the process is still running.
if (p.HasExited == false)
//Process is still running.
//Test to see if the process is hung up.
if (p.Responding)
//Process was responding; close the main window.
p.CloseMainWindow();
else
//Process was not responding; force the process to close.
p.Kill();
MessageBox.Show("Code continuing...");
如果你想启动另一个进程并读取它的输出,那么你可以使用 following pattern (from SO)
// Start the child process.
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "Write500Lines.exe";
p.Start();
// Do not wait for the child process to exit before
// reading to the end of its redirected stream.
// p.WaitForExit();
// Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
如果运行过程出错,如何将两者结合起来读取所有输入,而不陷入死锁和超时?
最佳答案
如果输出缓冲区填充了超过 4KB 的数据,此技术将挂起。一种更简单的方法是注册委托(delegate),以便在将内容写入输出流时得到通知。 I've already suggested this method before in another post :
ProcessStartInfo processInfo = new ProcessStartInfo("Write500Lines.exe");
processInfo.ErrorDialog = false;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardError = true;
Process proc = Process.Start(processInfo);
// You can pass any delegate that matches the appropriate
// signature to ErrorDataReceived and OutputDataReceived
proc.ErrorDataReceived += (sender, errorLine) => { if (errorLine.Data != null) Trace.WriteLine(errorLine.Data); };
proc.OutputDataReceived += (sender, outputLine) => { if (outputLine.Data != null) Trace.WriteLine(outputLine.Data); };
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
proc.WaitForExit();
关于c# ProcessStartInfo.Start - 读取输出但超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5718473/
ProcessStartInfo.EnvironmentVariables : A string dictionary that provides environment variables that
这是为什么 ProcessStartInfo myProcess = new ProcessStartInfo(path); myProcess.UserName = username; myProc
当我通过在 CMD 中键入以下内容手动向 Windows 添加服务时: “C:\Program Files (x86)\Windows Resource Kits\Tools\instsrv.exe”
根据 MSDN : 如果您没有使用 开始 启动进程的方法,开始信息 属性不反射(reflect)用于启动进程的参数。例如,如果您使用 获取进程 要获取计算机上运行的一系列进程,开始信息 每个人的属性(
当我尝试获取可执行文件的命令行参数时,我尝试检查 ProcessStartInfo Get-Process 返回的结构,但无论如何参数字段都是空的: PS C:\> ps notepad Handle
在我的 C# 应用程序中,我使用以下 ProcessStartInfo 调用 Process.Start(myPSI): ProcessStartInfo startInfoSigner = new
我创建了一个方法,它将以管理员身份执行 .exe 文件。 我想对两个不同的 .exe 文件使用相同的方法,但是 .exe 文件看起来彼此不同。因此,它们需要不同数量的参数。 方法如下: public
我正在将 C++ 代码移植到 C#,我在 C++ 代码中遇到了这个问题, SHELLEXECUTEINFO shell; memset(&shell, 0, sizeof(shell)); //the
我正在使用特殊的用户、域和密码启动一个进程。虽然我告诉 C# 隐藏它显示的控制台窗口。 这是我的代码: Process process = new Process(); process.StartIn
我正在使用 ProcessStartInfo 为文件打补丁,这样的文本文件(通过 cmd.exe): app.exe temp.txt patch.ips 我写了这段代码: ProcessStartI
这个问题在这里已经有了答案: Piping process output to new process (2 个答案) 关闭 5 年前。 在下面的 C# 代码中,我遇到了错误, ProcessSta
ProcessStartInfo.UseShellExecute 将如何影响我正在运行的进程? 我是否需要 UAC 的特殊权限才能使用 UseShellExecute? 它会在不同的用户上运行吗? 它
我整个上午都在处理这个问题,所以我来这里寻求帮助。阅读许多关于此的 SO 问题并尝试了所有解决方案但没有解决我的问题。 我刚开始使用 Process.Start(batchfile.bat); 它在某
我正在编写一个保持事件状态的服务来查看进程是否已启动并正在运行。我有几个同名的进程在不同的工作目录中运行。 因此,我想使用 WorkingDirectory属性作为唯一标识符。但是,当我查询所有这些属
我正在使用以下代码启动另一个带有参数的进程,这里我传递一个字符串路径作为参数,路径返回为 c:\documents and settings\\local settings: : string pat
但是它不起作用——这意味着 java 代码没有被执行。虽然批处理文件在 Windows 资源管理器中单击或在命令行中运行时运行良好.. 由于当批处理文件是单个 DOS 命令时这工作正常,我认为这在某种
如果你想启动另一个进程并等待(超时)完成你可以使用 the following (from MSDN) . //Set a time-out value. int timeOut=5000; //Ge
我想从 c# 代码运行一些 cmd 命令。我按照一些博客和教程得到了答案,但我有点困惑,即我应该如何传递多个参数? 我使用以下代码: System.Diagnostics.Process proces
我正在尝试从名为 teste.sh 的文件中运行以下命令 kpm restore k web 当我打开终端 cd 到正确的文件夹并执行“sh teste.sh”时,它们运行得很好,但是当我尝试在 mo
我想使用 shell 可执行文件以尊重要启动的应用程序的用户首选项,但我还需要知道该特定应用程序何时关闭。 Process editProcess = new Process(); ProcessSt
我是一名优秀的程序员,十分优秀!