在写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方法,供直接查找得到参数的值。
下载
源码下载链接