Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.NET/C# 获取一个正在运行的进程的命令行参数

.NET/C# 获取一个正在运行的进程的命令行参数

作者头像
walterlv
发布于 2020-02-10 08:06:00
发布于 2020-02-10 08:06:00
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

在自己的进程内部,我们可以通过 Main 函数传入的参数,也可以通过 Environment.GetCommandLineArgs 来获取命令行参数。

但是,可以通过什么方式来获取另一个运行着的程序的命令行参数呢?


进程内部获取传入参数的方法,可以参见我的另一篇博客:.NET 命令行参数包含应用程序路径吗?

.NET Framework / .NET Core 框架内部是不包含获取其他进程命令行参数的方法的,但是我们可以在任务管理器中看到,说明肯定存在这样的方法。

实际上方法是有的,不过这个方法是 Windows 上的专属方法。

对于 .NET Framework,需要引用程序集 System.Management;对于 .NET Core 需要引用 Microsoft.Windows.Compatibility 这个针对 Windows 系统准备的兼容包(不过这个兼容包目前还是预览版本)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ItemGroup Condition="$(TargetFramework) == 'netcoreapp2.1'">
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="2.1.0-preview.19073.11" />
</ItemGroup>
<ItemGroup Condition="$(TargetFramework) == 'net472'">
    <Reference Include="System.Management" />
</ItemGroup>

然后,我们使用 ManagementObjectSearcherManagementBaseObject 来获取命令行参数。

为了简便,我将其封装成一个扩展方法,其中包括对于一些异常的简单处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Diagnostics;
using System.Linq;
using System.Management;

namespace Walterlv
{
    /// <summary>
    /// 为 <see cref="Process"/> 类型提供扩展方法。
    /// </summary>
    public static class ProcessExtensions
    {
        /// <summary>
        /// 获取一个正在运行的进程的命令行参数。
        /// 与 <see cref="Environment.GetCommandLineArgs"/> 一样,使用此方法获取的参数是包含应用程序路径的。
        /// 关于 <see cref="Environment.GetCommandLineArgs"/> 可参见:
        /// .NET 命令行参数包含应用程序路径吗?https://blog.walterlv.com/post/when-will-the-command-line-args-contain-the-executable-path.html
        /// </summary>
        /// <param name="process">一个正在运行的进程。</param>
        /// <returns>表示应用程序运行命令行参数的字符串。</returns>
        public static string GetCommandLineArgs(this Process process)
        {
            if (process is null) throw new ArgumentNullException(nameof(process));

            try
            {
                return GetCommandLineArgsCore();
            }
            catch (Win32Exception ex) when ((uint) ex.ErrorCode == 0x80004005)
            {
                // 没有对该进程的安全访问权限。
                return string.Empty;
            }
            catch (InvalidOperationException)
            {
                // 进程已退出。
                return string.Empty;
            }

            string GetCommandLineArgsCore()
            {
                using (var searcher = new ManagementObjectSearcher(
                    "SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + process.Id))
                using (var objects = searcher.Get())
                {
                    var @object = objects.Cast<ManagementBaseObject>().SingleOrDefault();
                    return @object?["CommandLine"]?.ToString() ?? "";
                }
            }
        }
    }
}

使用此方法得到的命令行参数是一个字符串,而不是我们通常使用字符串时的字符串数组。如果你需要将其转换为字符串数组,可以使用我在另一篇博客中使用的方法:


参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/get-command-line-for-a-running-process.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#/.NET 使用 CommandLineParser 来标准化地解析命令行
CommandLineParser 是一款用于解析命令行参数的 NuGet 包。你只需要关注你的业务,而命令行解析只需要极少量的配置代码。
walterlv
2020/02/10
2.1K0
dotnet 通过 WMI 获取指定进程的输入命令行
使用下面代码,使用 Win32_Process 拿到所有的进程,通过 WHERE 判断当前的进程,然后拿到进程传入的命令
林德熙
2019/03/13
7660
.NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
我们有多种工具可以将程序集合并成为一个。比如 ILMerge、Mono.Merge。前者不可定制、运行缓慢、消耗资源(不过好消息是现在开源了);后者已被弃用、不受支持且基于旧版本的 Mono.Cecil。
walterlv
2023/10/22
2.4K0
.NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
安利一款非常好用的命令行参数库:McMaster.Extensions.CommandLineUtils
发布于 2017-10-21 01:44 更新于 2018-04-26 12:39
walterlv
2018/09/18
1.5K0
四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)
本文介绍四种不同的获取可执行程序文件路径的方法。适用于 .NET Core 以及 .NET Framework。
walterlv
2020/02/10
7.1K0
.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
我们有多种工具可以将程序集合并成为一个。打包成一个程序集可以避免分发程序的时候带上一堆依赖而出问题。
walterlv
2023/10/22
3.4K0
.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
C#程序之Main()方法
一、Main()方法的简介 1、一般情况下,一个C#可执行程序只有一个应用程序对象(也就是就程序入口),但是在某些情况,可能会有多个应用程序对象(程序入口),如单元测试中,这个时候我们就需要通过命令行指定以哪个Main()方法作为程序的入口。 2、分析Main()方法,我们发现Main()方法通过static修饰,这个主要是让我们可以通过类名加方法的形式吊用Main()方法,我们再调用之前不需要创建对象的实例(也就是new出该对象) 3、分析Main()方法的参数是一个字符串(string[] args),
郑小超.
2018/01/24
1.1K0
.NET 命令行参数包含应用程序路径吗?
发布于 2018-09-11 13:28 更新于 2018-09-13 03:24
walterlv
2018/09/18
5830
.NET 命令行参数包含应用程序路径吗?
【Linux】命令行参数与环境变量
在日常使用和开发中,Linux命令行以其强大而灵活的特性备受欢迎。而命令行参数与环境变量则是驱动这一强大工具的核心元素。通过合理地使用参数,我们可以精确控制命令的行为;借助环境变量,则能够配置和影响系统及程序的运行环境。本文将带你了解Linux命令行参数和环境变量的基础知识,帮助你更高效地驾驭Linux系统。
ephemerals__
2025/05/06
1400
【Linux】命令行参数与环境变量
如何优雅地处理命令行参数?
我们在Linux用到的命令常常支持很多参数,那么如何写一个程序,也像Linux命令一样支持很多参数呢?有什么什么优雅的处理方法?
编程珠玑
2019/08/21
1.2K0
在windows下查看某个运行程序(或进程)的命令行参数
在windows下查看某个运行程序(或进程)的命令行参数 使用下面的命令: wmic process get caption,commandline /value 如果想查询某一个进程的命令行参数,使用下列方式: wmic process where caption=”svchost.exe” get caption,commandline /value 这样就可以得到进程的可执行文件位置等信息。
用户2657851
2020/03/04
8.5K0
Win32 使用 CreateProcess 方法让任务管理器里的命令行不显示应用文件路径
本文记录一个 Win32 的有趣行为,调用 CreateProcess 方法传入特别的参数,可以让任务管理器里的命令行不显示应用文件路径
林德熙
2023/04/07
9430
Win32 使用 CreateProcess 方法让任务管理器里的命令行不显示应用文件路径
.NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
我们通常得到的命令行参数是一个字符串数组 string[] args,以至于很多的命令行解析库也是使用数组作为解析的参数来源。
walterlv
2020/02/10
1.9K0
Java SE进阶必备:数组中的命令行参数详解
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2024/01/30
2370
Java SE进阶必备:数组中的命令行参数详解
.NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持。我们可以将内存变量、命令行参数、环境变量和物理文件作为原始配置数据的来源,如果采用物理文件作为配置源,我们可以选择不同的格式(比如XML、JSON和INI等) 。如果这些默认支持的配置源形式还不能满足你的需求,我们还可以通过注册自定义ConfigurationSource的方式将其他形式数据作为我们的配置来源。 目录 一、内存变量 二
蒋金楠
2018/01/15
8240
.NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)
在默认情况下,Windows 系统中启动一个进程会继承父进程的令牌。如果父进程是管理员权限,那么子进程就是管理员权限;如果父进程是标准用户权限,那么子进程也是标准用户权限。
walterlv
2023/10/22
8.1K0
Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)
PowerShell 的命令行启动参数(可用于执行命令、传参或进行环境配置)
有一些程序不支持被直接启动,而要求通过命令行启动。这个时候,你就需要使用 PowerShell 或者 PowerShell Core 来启动这样的程序。我们都知道如何在命令行或各种终端中启动一个程序,但是当你需要自动启动这个程序的时候,你就需要知道如何通过 PowerShell 或其他命令行终端来启动一个程序,而不是手工输入然后回车运行了。
walterlv
2023/10/22
3.7K0
PowerShell 的命令行启动参数(可用于执行命令、传参或进行环境配置)
环境变量与命令行参数详解
​ 我们将其运行编译并生成为可执行文件 myproc ,当我们要运行它的时候,都得在这个可执行文件前面加一个 ./ 这是为什么?
利刃大大
2023/04/12
1.5K0
环境变量与命令行参数详解
NodeJS获取命令行后面的参数
假设有如下的命令行 node test.js arg1 arg2 arg3,现在想在test.js中获取后面的参数arg1、arg2、arg3…
ccf19881030
2020/06/24
10.5K0
WMI使用技巧集
WMI使用技巧集 很多的朋友对WMI可能见过但理解不深,我也是十分想了解关于WMI的知识,可一直找不运维
Java架构师必看
2021/03/22
9270
推荐阅读
相关推荐
C#/.NET 使用 CommandLineParser 来标准化地解析命令行
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验