问题的根源在于命令行的通配符展开。在linux下,bash shell会对通配符进行展开,并将展开后的文件名作为参数传递给程序。而在Windows下,命令行解析器(如cmd.exe)默认情况下不会将通配符展开,而是将其直接传递给程序。
为了解决这个问题,可以在程序中手动处理通配符展开。在Windows下,可以使用FindFirstFile/FindNextFile等API函数来处理通配符,将展开后的文件名以数组的形式传递给程序。在linux下,可以通过glob函数进行通配符展开,将展开后的文件名数组传递给程序。
以下是Windows下手动处理通配符展开的示例代码:
#include <windows.h>
#include <vector>
#include <string>
#include <iostream>
int main(int argc, char** argv)
{
std::vector<std::string> files;
for(int i = 1; i < argc; ++i)
{
std::string param(argv[i]);
if(param.find('*') != std::string::npos)
{
WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile(param.c_str(), &fd);
if(hFind != INVALID_HANDLE_VALUE)
{
do
{
files.push_back(fd.cFileName);
} while(FindNextFile(hFind, &fd));
FindClose(hFind);
}
}
else
{
files.push_back(param);
}
}
for(const std::string& file : files)
{
std::cout << file << std::endl;
}
return 0;
}
在上面的示例代码中,我们首先判断输入参数中是否包含通配符。如果包含,就使用FindFirstFile/FindNextFile函数对通配符进行展开,并将展开后的文件名添加到一个vector中。如果不包含通配符,则直接将参数添加到vector中。
最后,我们遍历vector,输出文件名即可。