0

命令行参数解析

发表者:wenzhou1219分类:接口2016-03-13 10:33:00 阅读[927]

常用的命令行形式有如下几种:

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方法,供直接查找得到参数的值。


下载链接 访问密码 2999





名字:

个人主页地址:

E-mail:

评论列表