从C#代码中捕获命令行参数

时间:2010-08-31 06:51:47

标签: c#-3.0

假设我在运行窗口中键入了excel.exe /r "c:\book1.xlsx"

我将如何trap the switch(/r) and the parameter "c:\book1.xlsx" from my C# code

由于

2 个答案:

答案 0 :(得分:4)

如果您的代码在进程中运行(在excel.exe中)

您可以通过Environment.CommandLine属性获取命令行。请注意,进程可以更改它自己的命令行(毕竟它只是内存中的一些字节),但这种做法并不常见。

如果您的代码在进程外运行(选项1,推荐)

您可以使用WMI获取另一个进程的命令行参数。见here。您需要添加对System.Management.dll的引用。例如:

string query = string.Format("SELECT CommandLine FROM Win32_Process WHERE Name='{0}'", "excel.exe");

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
    foreach (ManagementObject process in searcher.Get())
    {
        Console.WriteLine(process["CommandLine"]);
    }
}

这将打印excel.exe的所有正在运行的实例的命令行。您还可以使用ProcessId参数代替查询中的Name参数按进程ID进行查询。

如果您的代码在进程外运行(选项2,更棘手)

您还可以使用NtQueryInformationProcessReadProcessMemory读取进程环境块(PEB)以获取包含该命令的_RTL_USER_PROCESS_PARAMETERS,从而获得远程进程的命令行-线。但是,这些内容都没有记录,这意味着它不受支持且可能会发生变化。这样做的详细信息概述为here

答案 1 :(得分:0)

没有选项的命令行参数

示例:yourExecutable.exe parameter1 parameter2 parameter3

参考:http://msdn.microsoft.com/en-us/library/aa288457%28VS.71%29.aspx

带选项的命令行参数 - 没有可用的标准解析器。您需要自己编写或借用

示例:yourExecutable.exe -f fileName --create

参考:http://www.codeproject.com/KB/recipes/command_line.aspx