我有一个包含要传递给另一个可执行文件的命令行参数的字符串,并且我需要提取包含单个参数的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#实际生成的内容(删除了拆分字符串中多余的“”)
除了善良纯洁的托管解决方案由埃里克,它可能是值得一提的,为了完整起见,该Windows还提供了CommandLineToArgvW分手字符串转换成字符串数组功能:
CommandLineToArgvW
LPWSTR *CommandLineToArgvW( LPCWSTR lpCmdLine, int *pNumArgs); 解析Unicode命令行字符串,并以类似于标准C运行时argv和argc值的方式返回指向命令行参数的指针数组以及此类参数的计数。
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); } }