Почему эта команда 'findstr' не работает должным образом?

6280
CubicleSoft

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

findstr /sic:"\">" * 

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

Меняя это на:

findstr /sic:'\">' * 

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

2
какую ОС вы используете? EBGreen 11 лет назад 0
Windows 7. Обычная командная строка (т.е. без PowerShell). CubicleSoft 11 лет назад 0
Я проверю, но почему бы не использовать PS? EBGreen 11 лет назад 0
Инструменты базовой командной строки, как правило, достаточно для моих нужд. CubicleSoft 11 лет назад 0

2 ответа на вопрос

6
dsolimano

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

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

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

findstr /sic:"\"^>" * 
Это отлично работает. Karan 11 лет назад 0
+1 за ссылку на обширный пост в блоге MSDN. Отметить как ответ, потому что это работает. CubicleSoft 11 лет назад 0
4
Marcks Thomas

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

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

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

`findstr / sic:" "^>" * `* не * не работает * в Win7! Вы сами пробовали? Karan 11 лет назад 0
Как команда ведет себя в вашей системе? Я действительно попробовал это сам, на компьютере с Windows 7 и могу подтвердить, что он работает. Marcks Thomas 11 лет назад 0
Win7 x64, создал несколько текстовых файлов, в некоторых из них было ** "> **, а в остальных нет. Запустил вашу команду и просто получил мигающий курсор на следующей строке, как будто он ожидал ввода. Я мог набрать все, что хотел, несколько раз нажать Enter, но единственный способ вернуться к приглашению cmd был через Ctrl + C / Break. Нет вывода вообще. Karan 11 лет назад 1