Findstr не возвращает ожидаемый результат

Привет всем У меня есть следующая строка кода, чтобы перечислить все файлы, которые соответствуют слову Hello

findstr /s "Hello" .\*.* > C:\MyDir\result.txt

У меня есть несколько файлов внутри моей папки, как file1.xml а также file2.xml но когда я выполняю этот скрипт, он дает мне только file1.xml но не file2.xml Кто-нибудь может мне помочь. Содержимое внутри моих обоих файлов <Hello></Hello> а также <Hello>

2 ответа

Предполагая, что ваш регистр правильный, и вы хотите, чтобы регистр соответствовал (используйте /i чтобы сделать совпадения без учета регистра) Я подозреваю, что ваш второй файл в кодировке Unicode. Вы можете убедиться в этом, открыв файл в Блокноте и нажав Файл → Сохранить как.... В раскрывающемся списке " Кодировка" в нижней части диалогового окна "Сохранить как" отображается текущая кодировка файла.

findstr не может обрабатывать файлы Unicode, но find может (Раймонд Чен объяснил, почему есть две команды). Тем не мение, find не может перейти в подпапки, поэтому вам понадобится либо for петля

for /r %f in (*.*) do find "Hello" "%~ff"

или же forfiles:

forfiles /s /c "cmd /c find \"Hello\" @path"

С учетом вышесказанного, поскольку вы, похоже, имеете дело с файлами XML, вы можете использовать PowerShell вместо команд CMD не только потому, что он прозрачно обрабатывает ANSI и Unicode, но и потому, что он поставляется со встроенным анализатором XML.

В зависимости от того, что вы хотите достичь в конце концов, вы можете делать такие вещи, как

# get full paths for files containing <Hello> nodes
Get-ChildItem -Recurse |
  Where-Object { ([xml](Get-Content $_)).SelectNodes('//Hello') } |
  Select-Object -Expand FullName

или же

# get all <Hello> nodes
Get-ChildItem -Recurse | ForEach-Object {
  ([xml](Get-Content $_)).SelectNodes('//Hello')
}

Я думаю, что вы можете проверить свой синтаксис. Вы звоните перенаправить запись > когда я думаю, что вы хотите использовать переадресацию добавления >>, Итак, ваш пакетный файл выполняет свою работу... Он просто постоянно перезаписывает предыдущий результат.

Попробуй это:

findstr /s "Hello" .\*.* >> C:\MyDir\result.txt

Дополнительную информацию о перенаправлениях см. На этой странице по https://ss64.com/nt/syntax-redirection.html ss64.com.

Другие вопросы по тегам