C#的命令行参数

      这一周尝试着用C#写了两个后台程序,主程序用CreateProcess()传递命令行参数并创建进程。在实现的过程中,碰到了一个问题,命令行参数中如果带有空格该如何处理。一直认为,命令行中的空格用作参数的分隔符。如果参数内部有空格,该怎么办呢?譬如命令行的参数为“祝福 张学友 \Program Files\1 2 3.lrc”。

      刚开始写后台程序时,没考虑到这个问题。后来ZWF在使用时问起,才注意到。经过商量,决定自己定义一个命令行格式,用|作为分隔符。将“祝福 张学友 \Program Files\1 2 3.lrc”改为“祝福|张学友|\Program Files\1 2 3.lrc”。在后台程序中,首先将所有的参数合并,然后再通过分隔符|解析各个字段,代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            String temp = "";
            string song, singer, path;
            int head, tail;
            // 合并命令行参数
            for (int i = 0; i < args.Length; i++)
            {
                MessageBox.Show(args[i]);
                temp += args[i];
                temp += " ";
            }
            MessageBox.Show(temp);
            try
            {
                // 解析合并后的命令行
                head = temp.IndexOf('|', 0);
                song = temp.Substring(0, head);
                MessageBox.Show(song);
                head += 1;
                tail = temp.IndexOf('|', head);
                singer = temp.Substring(head, tail - head);
                MessageBox.Show(singer);
                path = temp.Substring(tail + 1);
                MessageBox.Show(path);
            }
            catch{}
        }
    }
}

       主程序是用C++写的,代码如下:

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR szCMD[MAX_PATH];
    PROCESS_INFORMATION pi;
    STARTUPINFO sii;

    memset(&sii, 0, sizeof(sii));
    sii.cb = sizeof(sii);
    sii.wShowWindow = SW_SHOW;
    sii.dwFlags = STARTF_USESHOWWINDOW;

    // 自定义格式的命令行参数
    wcscpy(szCMD, L" 祝福|张学友|\\Program Files\\1 2 3.lrc");
    // 使用系统支持的命令行参数
    //wcscpy(szCMD,L" 祝福 张学友 \"\\Program Files\\1 2 3.lrc\"");

    CreateProcess(_T(".\\ConsoleApplication1.exe"), szCMD,
        NULL, NULL, 0, 0, NULL, NULL, &sii, &pi);

    return 0;
}

       注意,wcscpy(szCMD, L" 祝福|张学友|\\Program Files\\1 2 3.lrc");中祝福前必须留一个空格,否则会导致后台程序接收的命令行不完整。关于这一点,请参考《C++和C#程序之间命令行参数传递和接收》,博主整理的非常细致。MSDN中有关C#命令行参数的说明,Main() 和命令行参数(C# 编程指南),其中提到了“与 C 和 C++ 不同,C#程序的名称不会被当作第一个命令行参数”。

      虽然通过自定义命令行的方式,解决了命令行参数本身带有空格的问题,但总感觉有点怪。这是参数不多,如果参数多了怎么办?按理来说,命令行参数的解析规则不能这么简单。在MSDN中查了一下,有其具体的解析规则Parsing C Command-Line Arguments。其中第一个示例就是解决命令行参数中带有空格的问题,只要将该参数放在一对双引号内就可以了。所以,将“祝福 张学友 \Program Files\1 2 3.lrc”改成“ 祝福 张学友 \"\Program Files\1 2 3.lrc\"”即可。通过实验证明,这种方法可行,且简单方便。

时间: 2024-09-30 21:24:45

C#的命令行参数的相关文章

【原创】memcached 中的命令行参数解析

     本文主要是以 memcached 源码为例,讲解如何在 linux 下解析命令行参数.  安装 memcached 后,查看其可用选项:  ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 [root@Be

getopt() 对命令行参数进行分析

getopt() 对命令行参数进行分析 int getopt( int argc, char *const argv[], const char *optstring );         给定了命令参数的数量 (argc).指向这些参数的数组 (argv) 和选项字符串 (optstring) 后,getopt() 将返回第一个选项,并设置一些全局变量.使用相同的参数再次调用该函数时,它将返回下一个选项,并设置相应的全局变量.如果不再有识别到的选项,将返回 -1,此任务就完成了.可以重复调用

php 命令行参数详解及应用

命令行|详解 大家知道,php是一种PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页.当用户打开php页面时,服务端便执行PHP的命令并将执行结果发送至用户的浏览器中,这类似于ASP和CoildFusion,PHP可以运行在WINDOWS和多种版本的UNIX上.除了能够操作您的页面外,PHP还能发送HTTP的标题.您可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种外部库来做用PDF文档解析XML的任

Ghost命令行参数一览表

许多人都听说过或用过Norton Ghost这个软件,然而由于它的界面全是英文的,导致许多国内网友为此而头痛.下面以它的7.0版为例,提供了Ghost的命令行参数. /?或/H:查看帮助. -CLONE:克隆. -IA:对所有分区中的扇区进行映象. -ID:对整个磁盘(包括未分区空间)进行复制. -IR:和ID一样,但不将分区调整为扇区界限. -IB:只复制磁盘的启动扇区. -IAL:对LINUX分区进行整个复制,对其它分区则用正常方法. -OR:覆盖空间并进行完整性检查. -NOLILO:复制

如何获取其它程序的命令行参数

开发环境:VC6 Windows XP 测试环境:WindowsXP 我们都知道,在程序里获取命令行参数很简单,WinMain函数会以参数的形式传递给我们,或者可以调用API GetCommandLine 获取.但是GetCommandLine函数不接受参数,获取的只是自己程序的命令行参数.那么如果我们想获取别的应用程序的命令行参数应该怎么办呢? 有的同学说,既然GetCommandLine只能获取本程序的命令行参数,我们可以在其它进程里插入一个Dll,在那个进程的地址空间调用GetComman

C/C++中命令行参数的原理

很早以前的dos应用程序中,我们经常会用命令行参数执行应用程序例如: copy c:\1.txt d:\ 在c/c++中,命令行参数的传递是利用main进行形参传递实现的 前面的教程中我们对面都进行了void main()或者是void main(void)的定义,这表示main不返回任何类型,和main不带有任何参数,但在缺剩状态下mian()这样形式下,形式参数一直是存在在栈空间内的只是隐藏了起来. 为了实现命令行参数我们将使用main(int argc,char* argv[])这样的形式

BCB的命令行参数

在你运行BCB的时候,你可以使用几个命令行参数来控制它的行为,这些参数的说明在BCB的帮助系统中,查找帮助主题,在索引中输入'IDE command-line options'就可以得到这些信息. 这里是一些有用的参数的摘要信息. -np = 在启动时不建立新的项目 -ns = 没有splash屏幕 (不减少装载时间) -dfoo.exe = 调试foo.exe -b foo.bpr = Builder项目foo.bpr -m foo.bpr = Make项目foo.bpr 注意:由于-b和-m

在C++ Builder中取得命令行参数

用过C语言编程的人都知道,在DOS下的编程可以通过main函数的参数取得命令行参数的个数以及每个参数的字符串,例如 int main(int argv ,char *argv[]) { - } 则命令行参数是argc个,这些参数分别存储在argv[0]-argv[argc-1]中,其中argv[0]是可执行文件的名字(含路径),那么Windows程序是怎么取得命令行参数的呢?用C语言写过windows程序的人都知道,在windows程序的主函数WinMain()中,有一个参数lpszCmd,这个

Oracle SQL*Loader详解(2) 命令行参数

sqlldr工具 SQL*Loader的客户端工具是sqlldr,在操作系统的命令行下输入sqlldr,后面不接任何参数,将显 示帮助信息如下所示(所有命令行参数的简单描述及其默认值),所以你并不需要对下面的参数死记硬 背,当你忘记它们时,可以通过这个方式快速查询. Valid Keywords: userid -- ORACLE username/password control -- control file name log -- log file name bad -- bad file

使用ANTLR进行命令行参数解析

关于命令行参数的解析没有特定的规则,目前比较流行的有unix风格和微软风格.其实除了unix风格 的比较一致外,微软自己提供的命令行参数解析就有很多种风格.在.net平台下的main函数中,仅仅把参 数分解为以空格分割的数组,这对需要加开关,并且有的开关有自己的参数的情况是不够的,而且为了解 析这些参数需要学习部分词法分析的知识,这对用处不是很大的命令行参数显得有些"鸡肋",当然用 Antlr来处理命令行参数更显得有些鸡肋,并且是大才小用,因为Antlr的语法规则比较复杂,学习起来有