Почему эта команда 'findstr' не работает должным образом?
6280
CubicleSoft
Я часто использую программу командной строки 'findstr', когда пишу программное обеспечение. Это помогает мне быстро найти все файлы, которые содержат определенную строку в наборе подкаталогов. В большинстве случаев использовать 'findstr' намного быстрее, чем что-либо еще. Сегодня я столкнулся с проблемой, в которой я хотел найти строку ">, поэтому я запустил эту команду (то, что я считал довольно типичной экранированной строкой):
findstr /sic:"\">" *
И вернул это загадочное сообщение об ошибке: «Неверный синтаксис имени файла, имени каталога или метки тома».
Меняя это на:
findstr /sic:'\">' *
Работает правильно. Почему мне нужно использовать одинарные кавычки вместо двойных? До этого я запускал сотни (может быть, тысячи?) Команд findstr, где я без проблем избежал двойных кавычек в оболочке двойных кавычек. Что отличает эту конкретную строку поиска?
какую ОС вы используете?
EBGreen 11 лет назад
0
Windows 7. Обычная командная строка (т.е. без PowerShell).
CubicleSoft 11 лет назад
0
Я проверю, но почему бы не использовать PS?
EBGreen 11 лет назад
0
Инструменты базовой командной строки, как правило, достаточно для моих нужд.
CubicleSoft 11 лет назад
0
2 ответа на вопрос
6
dsolimano
Здесь происходит два уровня обработки: сначала cmd.exeвыполняется синтаксический анализ командной строки для определения необходимости перенаправления и т. Д., А затем после этого findstrполучает оставшуюся командную строку и выполняет собственный анализ в соответствии со своими собственными правилами (на практике обычно одинаково для разных программ).
Мне кажется, что, поскольку он >является 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