findstr输出到文件中的问题

时间:2018-10-16 05:49:51

标签: batch-file findstr

我正在尝试遵循命令

findstr /RC:"h25v06.*hdf\"" "index.html" >temp.txt

获取 跟进

index.html:<img src="/icons/unknown.gif" alt="[   ]"> <a 
 href="MOD13Q1.A2018257.h25v06.006.2018282132046.hdf">
FINDSTR: Cannot open >temp.txt

它没有将输出保存到temp.txt 其他命令

dir * >list.txt

工作正常

1 个答案:

答案 0 :(得分:3)

您发现了一个问题,原因是cmd解析器和可执行程序参数解析器之间的引用处理不同。

这似乎是正确的

findstr /RC:"h25v06.*hdf\"" "index.html" >temp.txt
                        ^^                           escaped quote to findstr
            ^.............^ ^..........^             arguments to findstr
                                         ^           redirection operator

您的问题是,cmd尝试解析行(以创建命令的内部表示并确定是否需要重定向)时,对于cmd来说,双引号是“转义”(再次关闭并再次打开)报价,看到的报价为

findstr /RC:"h25v06.*hdf\"" "index.html" >temp.txt
                         ^^ escaped quote
            ^ open          ^close     ^open

这意味着一切都被视为findstr的参数

findstr /RC:"h25v06.*hdf\"" "index.html" >temp.txt
^.....^                                               command
        ^........................................^    argument

转义的引号将重定向操作符隐藏到cmd,它将重定向传递给findstr

findstr内部,参数处理有所不同,并且可以看到

findstr /RC:"h25v06.*hdf\"" "index.html" >temp.txt
            ^.............^ ^..........^ ^.......^    arguments to findstr

这意味着现在已将预期的重定向视为要在其中搜索的文件。

一种简单的解决方案是仅更改重定向的位置

>temp.txt findstr /RC:"h25v06.*hdf\"" "index.html" 

这会带来另一个问题。如所引述的那样,如果findstr处理的文件名包含空格或特殊字符,则该命令将失败,因为它们超出了引号区域。

因此,我们需要一种分隔两个引号的方法,而不必在findstr表达式中包括一个不需要的字符,但要正确地封闭每个引号区域

findstr /RC:"h25v06.*hdf\"^" "index.html" >temp.txt

^"cmd视为引号区域(由前面的引号封闭)中的真实转义引号,因此^不会传递给findstr 。现在,cmd的引用区域是

findstr /RC:"h25v06.*hdf\"^" "index.html" >temp.txt
            ^............^   ^..........^

有问题的引号是一个转义的序列,将其作为另一个字符处理,findstr接收了预期的参数

findstr /RC:"h25v06.*hdf\"" "index.html" 
            ^.............^ ^..........^