grep:输入文件“>”:系统找不到指定的文件

时间:2015-07-26 15:15:01

标签: c++ grep

当我尝试在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);

        }

1 个答案:

答案 0 :(得分:0)

您在评论中给出了答案:错误就像是,grep认为'>'也作为输入文件。当然有!为什么不呢?

让我解释一下:当你在shell提示符(或Windows下的cmd提示符)下编写grep -f strings_file file > result时, shell 会解析输入行,识别>重定向并处理重定向:

  • 打开result档案
  • 使用参数(或Windows的命令行)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