2

Я часто использую программу командной строки 'findstr', когда пишу программное обеспечение. Это помогает мне быстро найти все файлы, которые содержат определенную строку в наборе подкаталогов. В большинстве случаев использовать 'findstr' намного быстрее, чем что-либо еще. Сегодня я столкнулся с проблемой, в которой я хотел найти строку ">, поэтому я запустил эту команду (то, что я считал довольно типичной экранированной строкой):

findstr /sic:"\">" *

И вернул это загадочное сообщение об ошибке: «Неверный синтаксис имени файла, имени каталога или метки тома».

Меняя это на:

findstr /sic:'\">' *

Работает правильно. Почему мне нужно использовать одинарные кавычки вместо двойных? Я пробежал сотни (может, тысячи?) команд findstr до того, где я без проблем избежал двойных кавычек внутри оболочки двойных кавычек. Что отличает эту конкретную строку поиска?

2 ответа2

6

Здесь происходит два уровня обработки: сначала cmd.exe выполняет синтаксический анализ командной строки, чтобы определить, требуется ли перенаправление и т.д., А затем после этого findstr получает оставшуюся командную строку и выполняет собственный анализ в соответствии со своими собственными правилами. (на практике обычно одинаково для разных программ).

Это сообщение в блоге MSDN содержит некоторые подробности по этому вопросу.

Мне кажется, что, поскольку > является метасимволом cmd.exe , вам нужен экранирующий символ cmd.exe , который оказывается ^ . Например, эта команда работает для меня:

findstr /sic:"\"^>" *
4

Символ > используется для перенаправления и, как правило, его следует экранировать с помощью каретки, если он является частью литеральной строки. Заключение строки в кавычки предотвратит синтаксический анализ метасимволов и избавит от необходимости экранирования. Вот почему и echo ">" и echo ^> будут печатать фактический знак "больше, чем", вместо того, чтобы пытаться перенаправить вывод.

Второе вхождение двойных кавычек всегда отмечает конец буквальной строки. Этого нельзя избежать, потому что каретка не будет анализироваться как метасимвол; это между кавычками. В результате и echo "">" и echo "^">" попытаются перенаправить вывод, в этом случае в неверный файл.

В первой строке findstr /sic:"\">" * вторые двойные кавычки интерпретируются как конец буквальной строки. Следующий символ указывает на перенаправленный вывод. Последующее имя файла действительно недействительно; брошенная ошибка вряд ли загадочна. Оставшаяся часть предполагаемого аргумента даже не видна команде findstr, которая выполняет только /sic:"\" . Если вы хотите придерживаться двойных кавычек, следующий синтаксис будет вести себя как положено : findstr /sic:""^>" * .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .