Ваша схема поиска кажется наивным на двух фронтах:
1) JSON не гарантированно будет одной линией. Действительный JASON может иметь любое количество пробелов, включая символы новой строки. Это может вызвать проблемы, если ваша строка поиска логически соответствует нескольким строкам.
2) Что относительно подстрочных совпадений? Предположим, что одна строка поиска - bat
, а ваш JSON содержит bath
. Я сомневаюсь, что вы захотите рассмотреть этот матч.
Возможно, что ни одна из вышеуказанных проблем не является проблемой для вашего случая. Предполагая, что это не так, тогда с помощью FINDSTR может быть довольно простое решение.
Вы были близки с первой попытки, кроме
A) - Ваш FOR/F IN()
оговорка отсутствует Скобки
B) - Вы хотите, чтобы заставить каждую поисковую строку, которая будет интерпретироваться как строка буквального , возможно с пробелами. Для этого требуется опция /C:
.
C) - Вы предполагаете, ведущие пробелы не являются существенными в поисковой строке ("tokens=*"
полосы ведущих мест)
D) - Вы предполагаете, не поисковые строки не начинаются точкой с запятой. (The EOF по умолчанию символ точка с запятой, и FOR/F пропускает все строки, начинающиеся с символа EOF)
E) - Котировки и обратные косые должны быть экранированы в строке поиска:
\" -> \\\\\"
, \ -> \\
, " -> \"
. См. What are the undocumented features and limitations of the Windows FINDSTR command? для получения дополнительной информации.
Очки C) и D) может быть зафиксирована путем отключения EOF и DELIMS используя следующий нечетное синтаксис:
for delims^=^ eof^= %%A in ...
точка Е) может быть решена путем определения переменной и добавления управляющих последовательностей с помощью поиска и замены. Но для этого требуется отсроченное расширение, но замедленное расширение приведет к повреждению переменных FOR/F при расширении, если они содержат !
. Поэтому отсроченное расширение должно быть стратегически включено и выключено внутри цикла.
Вместо использования IF ERRORLEVEN n
вы можете использовать условную команду конкатенации ||
, чтобы принять меры, если предыдущая команда не удалась.
Вам не нужно видеть вывод команды FINDSTR, чтобы его можно было перенаправить в NUL.
Вы можете улучшить производительность, перенаправляя только один раз, вне цикла.
@echo off
setlocal disableDelayedExpansion
>fail_match.txt (
for /f delims^=^ eol^= %%A in (search.txt) do (
set "search=%%A"
setlocal enableDelayedExpansion
set "search2=!search:\"=\\"!"
set "search2=!search2:\=\\!"
set "search2=!search2:"=\"!"
findstr /c:"!search2!" check.txt >nul || echo !search!
endlocal
)
)
Если ни один из ваших строк поиска не начинается с ;
, и ни одна поисковая строка не содержит "
или \
, то решение может быть столь же просто, как:
@echo off
setlocal disableDelayedExpansion
>fail_match.txt (
for /f "delims=" %%A in (search.txt) do findstr /c:"%%A" check.txt >nul || echo %%A
)
Ваше предложение отлично работает. Спасибо. Кстати, есть только один JSON, с которым нужно иметь дело, и это одна строка. Кроме того, мне не нужно беспокоиться (например) о бат-ван против ванны. –