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);
C#,    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#
编程指南)
.aspx),其中提到了“与
C 和 C++ 不同,C#程序的名号不会被用作第一个命令行参数”。

     
固然通过自定义命令行的点子,解决了命令行参数本身蕴涵空格的问题,但总感到有些怪。这是参数不多,如若参数多了咋办?按理来说,命令行参数的剖析规则无法如此简单。在MSDN中查了一晃,有其实际的分析规则Parsing
C Command-Line
Arguments
.aspx)。其中第一个示范就是釜底抽薪命令行参数中隐含空格的问题,只要将该参数放在一对双引号内就可以了。所以,将“祝福
张学友 \Program Files\1 2 3.lrc”改成“ 祝福 张学友 \”\Program
Files\1 2 3.lrc\””即可。通过实验验证,这种措施使得,且简单方便。

相关文章