C# 进程
最后修改于 2023 年 7 月 5 日
在本文中,我们将探讨如何使用 System.Diagnostics 命名空间在 C# 中处理进程。
Process 类提供对本地和远程进程的访问,允许开发人员启动、停止、监视和与系统进程交互。无论是启动外部应用程序、捕获进程输出还是管理正在运行的任务,Process 类都提供了一套全面的功能。
为了配置进程执行,C# 提供了 ProcessStartInfo 类,该类指定了各种设置,例如
- FileName: 定义要运行的可执行文件或命令。
- Arguments: 将命令行参数传递给进程。
- UseShellExecute: 确定是否使用系统 shell 启动进程。
- RedirectStandardOutput: 启用捕获进程输出。
- CreateNoWindow: 指定是否在隐藏窗口中运行进程。
Process 类是 System.Diagnostics 命名空间的一部分,该命名空间包含用于调试、监视和性能分析的各种工具。
凭借启动、管理和终止系统进程的能力,C# 开发人员可以有效地与外部应用程序交互、自动化任务并分析系统活动。
C# 进程简单示例
在第一个示例中,我们启动一个控制台命令,该命令显示文件的内容。
using System.Diagnostics;
Process.Start("cat", @"C:\Users\Jano\Documents\words.txt");
该示例使用 cat 命令输出 words.txt 文件的内容。默认情况下,该命令不是 Windows 操作系统的一部分;它随 git 工具一起安装(请参阅 gitforwindows.org)。
Process.Start("cat", @"C:\Users\Jano\Documents\words.txt");
进程使用 Start 方法启动。
$ dotnet run sky cloud falcon owl crane
C# 进程运行程序
在以下示例中,我们运行一个 GUI 程序。
using System.Diagnostics; using var process = new Process(); process.StartInfo.FileName = "notepad.exe"; process.Start();
在该示例中,我们运行记事本程序。它是一个标准的、小型文本编辑器。
process.StartInfo.FileName = "notepad.exe";
StartInfo.FileName 属性设置或获取要启动的应用程序或文档。
using System.Diagnostics; using var process = new Process(); process.StartInfo.FileName = "notepad.exe"; process.StartInfo.Arguments = @"C:\Users\Jano\Documents\words.txt"; process.Start();
我们使用 StartInfo.Arguments 来传递要打开的文件名。
C# 启动和终止程序
下一个示例启动一个程序并在几秒钟后终止它。
using System.Diagnostics;
using var process = Process.Start("notepad.exe");
Thread.Sleep(3000);
process.Kill();
该示例启动记事本,睡眠三秒钟,然后使用 Kill 方法终止该进程。
C# Process.GetProcessesByName
Process.GetProcessesByName 创建一个新的 Process 组件数组,并将它们与共享指定进程名称的现有进程资源相关联。
using System.Diagnostics;
Process[] processes = Process.GetProcessesByName("Firefox");
Console.WriteLine("{0} Firefox processes", processes.Length);
Array.ForEach(processes, (process) =>
{
Console.WriteLine("Process: {0} Id: {1}",
process.ProcessName, process.Id);
});
在该示例中,我们找到属于 Firefox 的所有进程。 我们列出它们的 Id 和进程名称。
Process[] processes = Process.GetProcessesByName("Firefox");
我们通过名称“Firefox”获取进程数组。
Console.WriteLine("{0} Firefox processes", processes.Length);
我们打印找到的进程数量。
Array.ForEach(processes, (process) =>
{
Console.WriteLine("Process: {0} Id: {1}",
process.ProcessName, process.Id);
});
我们使用 ForEach 方法列出进程。
$ dotnet run 12 Firefox processes Process: firefox Id: 10056 Process: firefox Id: 13016 Process: firefox Id: 12944 Process: firefox Id: 10124 Process: firefox Id: 15556 ...
C# Process.GetProcesses
Process.GetProcesses 创建一个新的 Process 组件数组,并将它们与现有进程资源相关联。
using System.Diagnostics;
Process[] processes = Process.GetProcesses();
Array.ForEach(processes, (process) =>
{
Console.WriteLine("Process: {0} Id: {1}",
process.ProcessName, process.Id);
});
该示例列出所有进程。
Process[] processes = Process.GetProcesses();
我们获取进程数组。
Array.ForEach(processes, (process) =>
{
Console.WriteLine("Process: {0} Id: {1}",
process.ProcessName, process.Id);
});
我们迭代该数组并打印进程名称和 Id。
C# 进程重定向输出
StandardOutput 属性获取用于读取应用程序的文本输出的流。
using System.Diagnostics;
var psi = new ProcessStartInfo();
psi.FileName = "ls";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
using var process = Process.Start(psi);
using StreamReader reader = process.StandardOutput;
string data = reader.ReadToEnd();
File.WriteAllText("output.txt", data);
在该示例中,我们将 ls 命令的输出重定向到 output.txt 文件。
psi.UseShellExecute = false; psi.RedirectStandardOutput = true;
将 UseShellExecute 设置为 false 使我们能够重定向输入、输出和错误流。(在此上下文中,shell 指的是图形 shell,而不是命令 shell,例如 bash 或 sh。)
using var process = Process.Start(psi);
我们使用提供的信息启动进程。
using StreamReader reader = process.StandardOutput;
我们获取标准输出的 StreamReader。
string data = reader.ReadToEnd();
我们使用 ReadToEnd 方法读取所有数据。
File.WriteAllText("output.txt", data);
最后,我们将数据写入文件。
来源
在本文中,我们使用了 C# 中的进程。
作者
列出所有 C# 教程。