当我尝试在c ++中执行grep命令时,出现以下错误: grep:输入文件:“>”:系统找不到指定的文件
有人可以帮我解决这个问题吗?
wchar_t* grepArg= L"\"D:\\grep\" -f \"C:\\Users\\ic014733\\AppData\\Local\\Temp\\patterns.tmp\" \"D:\\LOG2014_10_05.LOG\" >\"D:\\share\\result.txt\"";
if ( !CreateProcessW(NULL, grepArg, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
{
DWORD errorMessageID = ::GetLastError();
}
else
{
DWORD res = WaitForSingleObject(pi.hProcess, INFINITE);
TerminateProcess(pi.hProcess, 0);
PostThreadMessage(pi.dwThreadId, WM_QUIT, 0, 0) ;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
答案 0 :(得分:0)
您在评论中给出了答案:错误就像是,grep认为'>'也作为输入文件。当然有!为什么不呢?
让我解释一下:当你在shell提示符(或Windows下的cmd提示符)下编写grep -f strings_file file > result
时, shell 会解析输入行,识别>
重定向并处理重定向:
result
档案grep
启动程序-f strings_file file
,将标准输出重定向到result
但是你只是在命令行中使用所有参数启动grep程序,因此不会发生重定向。
那你能做什么?由于您的路径都不包含空格,您可以让cmd.exe
为您执行重定向:
wchar_t* grepArg= L"cmd.exe /C \"D:\\grep -f C:\\Users\\ic014733\\AppData\\Local\\Temp\\patterns.tmp D:\\LOG2014_10_05.LOG > D:\\share\\result.txt";
这意味着您启动了一个包含两个参数的新cmd.exe
程序:/c
说执行,原始命令用引号括起来。但我从来没有找到在Windows中干净地包含引号的方法。这就是我从命令中删除所有内部引号的原因。这是可能的,因为任何路径都没有空间。
替代方法是手动执行重定向:打开输出文件,在hStdOutput
si
成员中传递其句柄,并通过在{{1}中设置STARTF_USESTDHANDLES
来声明它同一个结构的成员:
dwFlags