在写Windows程序的时候,通常我们都会遇到解析命令行参数的需求,这里想说说常见的命令行参数解析方法,最后给出一个自己封装的一个广泛适用的命令行解析类。

说明

常用的命令行形式有如下几种:
1.单独的参数
1.exe aa bb cc
1.exe /aa /bb /cc
1.exe -aa -bb -cc
2.键值对参数
1.exe -aa=bb -cc=dd
1.exe /aa=bb /cc=dd

对于第一种,有如下两种方法:
1.可以适用GetCommandLine获得命令行参数,使用CommandLineToArgvW解析成参数数组,这里有个限制只能解析Unicode形式的命令行
2.可以使用编译器提供的伪变量__argv和__argc
但对于第二种种API就没有很好的支持。

使用示例

//命令行参数遍历回调函数定义
void WINAPI DumpVec(LPCTSTR pszItem)
{
    wcout << pszItem << endl;
}

void WINAPI DumpMap(LPCTSTR pszItemKey, LPCTSTR pszItemValue)
{
    wcout << pszItemKey << _T("=>") << pszItemValue << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    vector<CString> cmdvec;
    map<CString, CString> cmdmap;
    CCommandParser cmdParse;

    //参数解析成Vector形式
    wcout << _T("Parse CommandLine To Vector:") << endl;
    cmdParse.SetCmdLine(_T("d:\\11\\23\\1.exe aa    bb     cc"));
    cmdParse.Parse(&cmdvec, DumpVec);

    //参数解析成Map键值对形式
    wcout << endl << _T("Parse CommandLine To Map:") << endl;
    cmdParse.SetCmdLine(_T("c:\\111\\ccc\\1.exe /aa=bb     /cc=dd   -ee  ff   /gg=1000   /hh=10.36"));
    cmdParse.Parse(&cmdmap, DumpMap);

    //搜索的方式解析键值对的值
    wcout << endl << _T("Search Map Param in CommandLine:") << endl;
    CString csValue;
    cmdParse.GetParam(_T("/aa="), csValue);
    wcout << _T("aa=") << csValue.GetBuffer() << endl;

    int nValue;
    cmdParse.GetParam(_T("/gg="), nValue);
    wcout << _T("gg=") << nValue << endl;

    double dbValue;
    cmdParse.GetParam(_T("/hh="), dbValue);
    wcout << _T("hh=") << dbValue << endl;

    //输出可执行文件路径
    wcout << endl << _T("Excute Path is:") << endl;
    CString csPath;
    cmdParse.GetExcutePath(csPath);
    wcout << csPath.GetBuffer() << endl;
    return 0;
}

输出结果如下

Parse CommandLine To Vector:
aa
bb
cc

Parse CommandLine To Map:
aa=>bb
cc=>dd
ee=>ff
gg=>1000
hh=>10.36

Search Map Param in CommandLine:
aa=bb
gg=1000
hh=10.36

Excute Path is:
c:\111\ccc\1.exe

可以看到,使用很简单:
SetCommandLine后调用解析Parse函数,第一种参数解析保存在vector中,第二种参数解析保存在map中,这两种参数都可以调用回调函数对解析的每个参数做自定义行为。
还提供了直接取参数的GetParam方法,供直接查找得到参数的值。

下载

源码下载链接