内容简介:我们通常得到的命令行参数是一个字符串数组然而如我我们得到了一整个命令行字符串呢?这个时候可能我们原有代码中用于解析命令行的库或者其他辅助函数不能用了。那么如何转换成数组呢?在 Windows 系统中有函数
我们通常得到的命令行参数是一个字符串数组 string[] args
,以至于很多的命令行解析库也是使用数组作为解析的参数来源。
然而如我我们得到了一整个命令行字符串呢?这个时候可能我们原有代码中用于解析命令行的库或者其他辅助函数不能用了。那么如何转换成数组呢?
在 Windows 系统中有函数 CommandLineToArgvW 可以直接将一个字符串转换为命令行参数数组,我们可以直接使用这个函数。
LPWSTR * CommandLineToArgvW( LPCWSTR lpCmdLine, int *pNumArgs );
此函数在 shell 32.dll 中,于是我们可以在 C# 中调用此函数。
为了方便使用,我将其封装成了一个静态方法。
using System; using System.ComponentModel; using System.Runtime.InteropServices; namespace Walterlv { public static class CommandLineExtensions { public static string[] ConvertCommandLineToArgs(string commandLine) { var argv = CommandLineToArgvW(commandLine, out var argc); if (argv == IntPtr.Zero) { throw new 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); } } [DllImport("shell32.dll", SetLastError = true)] static extern IntPtr CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs); } }
参考资料
- CommandLineToArgvW function - Microsoft Docs
- Converting Command Line String to Args[] using CommandLineToArgvW() API - IntelliTect
- Split string containing command-line parameters into string[] in C# - Stack Overflow
本文会经常更新,请阅读原文: https://walterlv.com/post/convert-command-line-string-to-args-array.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接:https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com) 。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Go语言-执行系统命令以及获取命令行参数
- Python 命令行参数
- Nginx 命令行参数
- 每天一个 Linux 命令(22):find 命令的参数详解
- 给go程序添加命令行参数
- Python 获得命令行参数的方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。