Выход из цитаты в строке поиска findstr - PullRequest
8 голосов
/ 13 февраля 2011

Как правильно избежать кавычки в строке поиска при использовании findstr.exe?

Пример:

findstr /misc:"namespace=\"" *.cs > ns.txt

Выводится на консоль, а не в указанный мной файл.

Я делаю это прямо в командной строке, а не в командном файле, хотя эта информация тоже может быть полезна.

Ответы [ 4 ]

7 голосов
/ 13 февраля 2011

Пожалуйста, поправьте меня, если я ошибаюсь, но я думаю, что понял это:

findstr.exe /misc:^"namespace=\^"^" *.cs > ns.txt

Похоже, это дает правильный вывод, даже если в строке поиска есть пробелы. Это позволяет корректно работать с перенаправлением файлов, конвейером и дополнительными литералами в одном и том же вызове findstr.exe.

Исходная команда в моем вопросе не работает, потому что и cmd.exe, и findstr.exe имеют специальную обработку для символа ". Я получил непревзойденный набор цитат при обработке cmd.exe.

Новая команда в моем ответе работает, потому что ^" позволяет передать кавычку из cmd.exe в findstr.exe, а \" говорит findstr.exe игнорировать эту кавычку для обработки команд и обрабатывать ее как символьный литерал.

Редактировать

Что ж, мое решение было правильным, но причина, по которой оно было правильным, была совершенно неверной. Я написал небольшую программу для проверки.

Я обнаружил, что cmd.exe передает этот ввод программе, когда я передаю неверную командную строку:

test.exe /misc:namespace=" *.cs > ns.txt

После правильного экранирования символов cmd.exe передает этот ввод программе (и перенаправляет вывод в файл):

test.exe /misc:namespace=" *.cs
4 голосов
/ 13 февраля 2011

Найдено Re: FINDSTR ищет полезную цитату и перенаправляет / передает вывод

Try this: 

findstr > x.txt /S /I /M /C:"\.\"" * 

Понятия не имею, почему это работает.

Однако не работает для передачи результатов. См. Ссылку по ссылке Вывод трубопровода

2 голосов
/ 04 ноября 2016

Согласно моим тестам, правильный escape-символ - это обратный слеш:

c:\Temp>findstr /isc:"session id=\"59620\"" C:\Temp\logs\some*.xml
C:\Temp\logs\some_2016_11_03.xml: <session id="59620" remoteAddress="192.168.195.3:49885"/>
1 голос
/ 13 февраля 2011

Разве этого было бы недостаточно:

findstr /misc:namespace=^" *.cs > ns.txt

?

РЕДАКТИРОВАТЬ

Если вы искали способ пройти" символ внутри параметра в кавычках, тогда это может быть (на вашем примере)

findstr /misc:"namespace=""" *.cs > ns.txt

(символ " повторяется внутри строки в кавычках).

...