Команда findstr не работает в командном файле Windows

Я сделал простой пакетный файл в Windows. он работает, сообщая, чтобы найти URL-адрес, включая ошибку. но все URL-адреса повторяют только успех.

Команда wget stdout кажется пустой. перенаправление трубы не работает. что не так??

@echo off
for /f "delims=" %%i in (TEST.txt) do call :request %%i
set /p in=Finish!

:request
echo | set /p= %1 >> result.txt
wget.exe -T 3 --tries=2 %1 | findstr /I "error"
if %errorlevel% == 0 (
    echo error >> result.txt
) else (
    echo success >> result.txt
)

Моя проблема решена. Модифицированный код из хорошего ответа

@echo off
set logFile="log.txt"
set resultFile="result.txt"

for /f "delims=" %%i in (TEST.txt) do call :request %%i 
set /p in=Finish!

:request
echo|set /p= %1 >> %resultFile%
wget.exe -P download -T 3 --tries=2 %1  2>&1 | tee -a %logFile% | findstr /I "error" > nul
if %errorlevel% == 0 (
    echo error >> result.txt
) else (
    echo success >> result.txt
)

person 김현우    schedule 12.04.2018    source источник
comment
каково расширение вашего пакетного файла? .bat или .cmd ?   -  person Gerhard    schedule 12.04.2018
comment
Это .bat. Это связано?   -  person 김현우    schedule 12.04.2018
comment
ой!! Спасибо! Я не думал о разнице .bat между файлом .cmd. ссылка - stackoverflow.com/questions/148968/   -  person 김현우    schedule 12.04.2018
comment
да, поэтому уровень ошибок будет сброшен с помощью cmd :) Теперь это работает?   -  person Gerhard    schedule 12.04.2018
comment
это работает сейчас как .cmd ?   -  person Gerhard    schedule 12.04.2018
comment
@GerhardBarnard — FINDSTR — это внешняя команда, поэтому она всегда устанавливает для ERRORLEVEL значение 0 или 1. Проблема .bat и .cmd возникает только с некоторыми внутренними командами.   -  person dbenham    schedule 12.04.2018
comment
@dbenham. Я знаю об этом, но протестировал эту проблему с .cmd и не воспроизвел проблему OP, отсюда и комментарий. Не уверен, что это помогло ему, хотя ждал ответа.   -  person Gerhard    schedule 12.04.2018
comment
Мой gnu wget записывает диагностическую информацию в stderr, поэтому потребуется перенаправление. Смотрите мой ответ.   -  person dbenham    schedule 12.04.2018
comment
Это хорошо работает после того, как я изменил его на .cmd. Я использую wget, загруженный в утилите gnu, но в случае с findstr я мог бы использовать его без дополнительной работы. Я не понимаю, что findstr — это внешняя команда.   -  person 김현우    schedule 13.04.2018
comment
о .. Ваше утверждение связано с командой tee в моем измененном коде?   -  person 김현우    schedule 13.04.2018


Ответы (2)


Диагностическая информация wget, которую вы пытаетесь прочитать, записывается в stderr, а не в stdout. Поэтому вам просто нужно перенаправить stderr на stdout перед вашей трубой.

Предполагая, что все ваши аргументы wget верны, я бы написал код следующим образом:

@echo off
>result.txt (for /f "delims=" %%i in (TEST.txt) do (
  wget.exe -T 3 --tries=2 %%I 2>&1|findstr /i error >nul&&echo %%i ERROR||echo %%i SUCCESS
))
echo Finished!
person dbenham    schedule 12.04.2018
comment
РЕДАКТИРОВАТЬ - исправлена ​​логика кода - мой первоначальный ответ был изменен, а критическое перенаправление отсутствовало - person dbenham; 12.04.2018

Я предполагаю, что вы хотите echo только result.txt вместо терминала/консоли.

if %errorlevel% == 0 (
    echo error >> result.txt > /dev/null 2>&1
) else (
    echo success >> result.txt > /dev/null 2>&1
)

Эти изменения не могут отображаться на консоли/терминале

person ntshetty    schedule 12.04.2018