в чем разница между 2 кодами findstr ниже?

Могу ли я узнать, в чем разница между 2 кодами findstr ниже?

Первый случай:

findstr /m 0632 log_network.txt
if %errorlevel%==0 (
    echo FOUND
) else (
    echo NOT FOUND
)

Второй случай:

set entire_line="0632"
echo %entire_line% | findstr /m log_network.txt
if %errorlevel%==0 (
    echo FOUND
) else (
    echo NOT FOUND
)

Первый случай возвращает "FOUND", а второй возвращает "NOT FOUND"... Кроме того, я всегда вижу, как людям нравится использовать:

echo %something% | findstr /m filename.txt > null

Но я не понимаю, почему они так пишут...

log_network.txt Содержимое:

Set_Param_10A "TRUE" "xnetwork.exist.5846"
Set_Param_10A "TRUE" "xnetwork.exist.7425"
Set_Param_10A "TRUE" "xnetwork.exist.1420"
Set_Param_10A "TRUE" "xnetwork.exist.0632"
Set_Param_10A "TRUE" "xnetwork.exist.1112"
Set_Param_10A "TRUE" "xnetwork.exist.8524"
Set_Param_10A "TRUE" "xnetwork.exist.3675"
Set_Param_10A "TRUE" "xnetwork.exist.3344"
Set_Param_10A "TRUE" "xnetwork.exist.1276"
Set_Param_10A "TRUE" "xnetwork.exist.4796"
Set_Param_10A "TRUE" "xnetwork.exist.3349"
Set_Param_10A "TRUE" "xnetwork.exist.0048"

Спасибо...


person Pi-Turn    schedule 10.06.2014    source источник
comment
Хм... Мне НЕ нравится использовать echo %something% | findstr "search". Обычно это делается с каждой строкой файла, что подразумевает выполнение findstr.exe (файл размером 30 КБ) несколько раз (это s_l_o_w...). Этот тест обычно можно выполнить с помощью простого if, который намного быстрее!   -  person Aacini    schedule 10.06.2014


Ответы (1)


Первый случай — это поиск строки 0632 в файле log_network.txt, и если она будет найдена в файле, имя файла будет выведено на консоль (переключатель /m). Если найдено, уровень ошибки будет равен 0, если не найден, уровень ошибки будет равен 1.

Второй случай — это поиск строки log_network.txt в данных, которые он получает из стандартного ввода, то есть "0632". Вероятно, это ошибка или неправильное толкование того, как работает findstr.

Чтобы «имитировать» функциональность первого кода, но используя структуру второго, это должно быть что-то вроде

set "entire_line=0632"
echo %entire_line%| findstr /g:/ /m log_network.txt

То есть сначала удалить кавычки из искомого значения (в исходном коде они включены в значение), а затем попросить findstr взять строки поиска из стандартного ввода (/g:/), сверить их с содержимым файла log_network.txt и вывести результат имя файла, если найдено совпадение (/m)

В любом случае, это намного эффективнее первой конструкции. Создание канала требует большего использования процессора, чем просто оставить findstr непосредственно выполнять работу.

person MC ND    schedule 10.06.2014