คำสั่ง 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
ใช่ ดังนั้น errorlevel จะถูกรีเซ็ตด้วย cmd :) ตอนนี้ใช้งานได้แล้วหรือยัง?   -  person Gerhard    schedule 12.04.2018
comment
ตอนนี้มันทำงานเป็น .cmd หรือเปล่า?   -  person Gerhard    schedule 12.04.2018
comment
@GerhardBarnard - FINDSTR เป็นคำสั่งภายนอก ดังนั้นจึงตั้งค่า ERRORLEVEL เป็น 0 หรือ 1 เสมอ ปัญหา .bat vs .cmd เกิดขึ้นกับคำสั่งภายในบางคำสั่งเท่านั้น   -  person dbenham    schedule 12.04.2018
comment
@dbenham. ฉันทราบเรื่องนั้นแล้ว แต่ทดสอบปัญหานี้ด้วย .cmd และไม่ได้จำลองปัญหา OP ซ้ำ ดังนั้นความคิดเห็น ไม่แน่ใจว่ามันช่วยเขาได้หรือเปล่า แต่กำลังรอคำตอบอยู่   -  person Gerhard    schedule 12.04.2018
comment
gnu ของฉันเขียนข้อมูลการวินิจฉัยไปที่ 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