我正在尝试遵循命令
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
工作正常
答案 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"
^.............^ ^..........^