如何在 C# 中读取另一个进程的命令行参数?

Posted

技术标签:

【中文标题】如何在 C# 中读取另一个进程的命令行参数?【英文标题】:How to read command line arguments of another process in C#? 【发布时间】:2009-02-02 18:10:50 【问题描述】:

如何获取另一个进程的命令行参数?

使用System.Diagnostics.Process 类的静态函数,我可以获得正在运行的进程列表,例如按名称:

Process[] processList = Process.GetProcessesByName(processName);

但是,无法访问用于启动此进程的命令行。如何做到这一点?

【问题讨论】:

你能解释一下你这样做的目的吗?它可能有助于获得更好的解决方案。 我想检索命令行参数以找到应用程序的正确实例,在我的例子中是 msiexec。 Raymond Chen 的有趣文章:blogs.msdn.com/oldnewthing/archive/2009/11/25/9928372.aspx 【参考方案1】:

如果您没有使用 Start 方法启动进程,则 StartInfo 属性不会反映用于启动进程的参数。例如,如果您使用 GetProcesses 获取计算机上运行的进程数组,则每个 Process 的 StartInfo 属性不包含用于启动进程的原始文件名或参数。 (来源:MSDN)

Stuart 的 WMI 建议不错:

string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='0'", processName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery);
ManagementObjectCollection retObjectCollection = searcher.Get();
foreach (ManagementObject retObject in retObjectCollection)
    Console.WriteLine("[0]", retObject["CommandLine"]);

【讨论】:

你应该处理这些对象。 请注意,如果运行上述代码的进程在非特权帐户下运行,则返回的 CommandLine 将为 null,例如在我的情况下(服务作为 LocalService 运行) CommandLine 返回可执行文件的完整路径。可能这是Windows7下的问题。我没有在XP下测试。 适用于我的 Win 7 SP1 x64。我有管理员权限。 命名空间 System.Management.ManagementObjectSearcher,位于 System.Management.dll【参考方案2】:

如果您的目标是 Windows XP 或更高版本,并且可以负担 WMI 的开销,则可以使用具有 CommandLine 属性的 WMI 的 WIN32_Process class 查找目标进程。

【讨论】:

【参考方案3】:

Process.StartInfo 返回一个 ProcessStartInfo 对象,据称但不一定在 Arguments 属性中具有参数。

【讨论】:

在我的情况下没有 :( 可能这仅在其他进程托管在 CLR 中时才有效。 事实上,Arguments 属性只有在进程是使用 ProcessStartInfo 对象从托管进程启动时才会设置。【参考方案4】:

这两个项目都是你的吗?您能否修改您尝试检查的进程的源代码,使其为您提供命令行参数,而不是尝试从该进程之外的某个位置读取它们?

【讨论】:

不,另一个进程是微软的msiexec

以上是关于如何在 C# 中读取另一个进程的命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中访问 Main 之外的命令行参数

如何在 C# 中使用命令行参数创建应用程序快捷方式(.lnk 文件)

从命令行读取参数 - 错误 TS2304:找不到名称“进程”

如何通过 c# 传递多个命令行参数

如何在 PowerShell 或 C# 中获取进程的命令行信息

如何在 C# 中解析命令行参数 [重复]