C++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#
编程指南).aspx),其中涉及了“与
C 和 C++ 不同,C#次的名称不会见受看成第一个令执行参数”。

     
虽然通过从定义命令行的主意,解决了命执行参数本身蕴藏空格的题材,但究竟感到微微生。这是参数不多,如果参数多矣怎么处置?按理来说,命令执行参数的辨析规则不克这么简单。在MSDN中翻了一晃,有那个实际的辨析规则Parsing
C Command-Line
Arguments.aspx)。其中第一单示范就是釜底抽薪命令执行参数中蕴含空格的题材,只要将该参数放在一对双引号内即可了。所以,将“祝福
张学友 \Program Files\1 2 3.lrc”改成“ 祝福 张学友 \”\Program
Files\1 2 3.lrc\””即可。通过试验证明,这种措施有效,且简单好。