一尘不染

在C#中将包含命令行参数的字符串拆分为string []

c#

我有一个包含要传递给另一个可执行文件的命令行参数的字符串,并且我需要提取包含单个参数的string
[],方法与在命令行上指定命令的C#相同。通过反射执行另一个程序集入口点时,将使用string []。

为此有标准功能吗?还是有一种正确分割参数的首选方法(正则表达式?)?它必须处理’“’分隔的字符串,这些字符串可能正确包含空格,因此我不能只对’‘进行拆分。

示例字符串:

string parameterString = @"/src:""C:\tmp\Some Folder\Sub Folder"" /users:""abcdefg@hijkl.com"" tasks:""SomeTask,Some Other Task"" -someParam foo";

结果示例:

string[] parameterArray = new string[] { 
  @"/src:C:\tmp\Some Folder\Sub Folder",
  @"/users:abcdefg@hijkl.com",
  @"tasks:SomeTask,Some Other Task",
  @"-someParam",
  @"foo"
};

我不需要命令行解析库,而只是获取应该生成的String []的一种方法。

更新 :我必须更改预期结果以匹配C#实际生成的内容(删除了拆分字符串中多余的“”)


阅读 260

收藏
2020-05-19

共1个答案

一尘不染

除了善良纯洁的托管解决方案埃里克,它可能是值得一提的,为了完整起见,该Windows还提供了CommandLineToArgvW分手字符串转换成字符串数组功能:

LPWSTR *CommandLineToArgvW(
    LPCWSTR lpCmdLine, int *pNumArgs);

解析Unicode命令行字符串,并以类似于标准C运行时argv和argc值的方式返回指向命令行参数的指针数组以及此类参数的计数。

在“ 使用CommandLineToArgvW()API将命令行字符串转换为Args
[]
”中找到从C#调用此API并在托管代码中解压缩结果字符串数组的示例。下面是相同代码的稍微简化的版本:

[DllImport("shell32.dll", SetLastError = true)]
static extern IntPtr CommandLineToArgvW(
    [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs);

public static string[] CommandLineToArgs(string commandLine)
{
    int argc;
    var argv = CommandLineToArgvW(commandLine, out argc);        
    if (argv == IntPtr.Zero)
        throw new System.ComponentModel.Win32Exception();
    try
    {
        var args = new string[argc];
        for (var i = 0; i < args.Length; i++)
        {
            var p = Marshal.ReadIntPtr(argv, i * IntPtr.Size);
            args[i] = Marshal.PtrToStringUni(p);
        }

        return args;
    }
    finally
    {
        Marshal.FreeHGlobal(argv);
    }
}
2020-05-19