当前位置: 首页 > news >正文

.NET/C# 将一个命令行参数字符串转换为命令行参数数组 args

我们通常得到的命令行参数是一个字符串数组 string[] args,以至于很多的命令行解析库也是使用数组作为解析的参数来源。

然而如我我们得到了一整个命令行字符串呢?这个时候可能我们原有代码中用于解析命令行的库或者其他辅助函数不能用了。那么如何转换成数组呢?


在 Windows 系统中有函数 CommandLineToArgvW 可以直接将一个字符串转换为命令行参数数组,我们可以直接使用这个函数。

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

此函数在 shell32.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/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

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

相关文章:

  • .NET/C# 获取一个正在运行的进程的命令行参数
  • 使用一句 git 命令将仓库的改动推送到所有的远端
  • 将 svn 仓库迁移到 git 仓库
  • 使用 Visual Studio 调试多进程的程序
  • 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀)
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)
  • 为 WPF 程序添加 Windows 跳转列表的支持
  • 在 Windows 系统上降低 UAC 权限运行程序(从管理员权限降权到普通用户权限)
  • 专栏素材
  • Visual Studio 如何能够不进行编译就调试 .NET/C# 项目(用于解决大项目编译缓慢的问题)
  • 仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢?
  • 全局或为单独的项目添加自定义的 NuGet 源
  • 电脑总是意外从睡眠状态唤醒,可以找出原因然后解决
  • 我收集的各种公有 NuGet 源
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CSS居中完全指南——构建CSS居中决策树
  • es的写入过程
  • Git 使用集
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Javascript Math对象和Date对象常用方法详解
  • javascript从右向左截取指定位数字符的3种方法
  • JS笔记四:作用域、变量(函数)提升
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • mysql外键的使用
  • PHP 的 SAPI 是个什么东西
  • PV统计优化设计
  • react-native 安卓真机环境搭建
  • React-生命周期杂记
  • zookeeper系列(七)实战分布式命名服务
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何编写一个可升级的智能合约
  • 删除表内多余的重复数据
  • 什么软件可以剪辑音乐?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 网络应用优化——时延与带宽
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • (Java数据结构)ArrayList
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Sql Server 保留几位小数的两种做法
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .Net 应用中使用dot trace进行性能诊断
  • .Net接口调试与案例
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net组件程序设计之线程、并发管理(一)
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)