проблемы с выводом findstr в файл - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь выполнить следующую команду

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

получить следующую команду put

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 голосов
/ 16 октября 2018

Вы обнаружили одну проблему, вызванную разницей в обработке цитат между 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" 
            ^.............^ ^..........^
...