2010-05-18 30 views
10

là nó có thể để trả lại errorlevel cũng nếu tôi ống đầu ra của một kịch bản vào một logfile:của Windows batch file: ống phá hủy mã trở lại của tôi

test1.bat:

call test2.bat 2>&1 | tee log.txt 
echo ERRORLEVEL: %ERRORLEVEL% 

test2.bat:

exit /B 1 

Output test1.bat khi gọi:

ERRORLEVEL: 0 

Các errorlevel luôn là 0.

Vấn đề là, tôi muốn gọi một kịch bản bên trong kịch bản của tôi, nơi sản lượng nên được chuyển hướng đồng bộ với sản lượng hiện trong dòng lệnh, do đó một cách đơn giản > là không đủ cho tôi. Tôi đã thử nhiều ý tưởng, nhưng kết quả là các đường ống luôn luôn có vẻ để tiêu diệt các lỗi cấp cho ... :(

Bạn có thể cho tôi bất kỳ lời đề nghị hơn nữa?

Cảm ơn trước ... :)


Cám ơn câu trả lời của bạn ... Thật không may điều này không làm việc cũng ... :(Hãy xem những gì tôi đã cố gắng:

test1.bat:

echo off 
set VAR1=" " 
echo VAR1 before test2: %VAR1% 
call test2.bat 2>&1 | tee log.txt 
echo VAR1 after test2: %VAR1% 

test2:

@echo off 
set VAR1=ERROR 
echo VAR1 in test2: %VAR1% 
exit /B 1 

Output khi gọi test1.bat:

VAR1 before test2: " " 
VAR1 in test2: ERROR 
VAR1 after test2: " " 

Là một giải pháp khác mà tôi đã cố gắng để tiết kiệm "ERRORVALUE: 1" vào logfile trong trường hợp có lỗi. Trong mainscript tôi muốn phân tích bản ghi tìm kiếm chuỗi này. Thật không may lưu find-kết quả đến một biến môi trường không làm việc là tốt, tôi đã như sau:

FOR /F "tokens=1 delims=" %%A in ('type %logDir%\03_applySqls.log | find /c "ERRORVALUE: 1"') do SET val=%%A 

Lỗi tôi nhận được:

"|" ist syntaktisch an dieser Stelle nicht verarbeitbar. 

Vậy làm thế nào tôi có thể ít nhất là phân tích logfile của tôi và trong trường hợp chuỗi được tìm thấy trong nhật ký tôi có thể trả về giá trị dưới dạng lỗi không?

+0

rất liên quan: http://stackoverflow.com/questions/11170753/windows-command-interpreter-how-to-obtain-exit-code-of-first -pip-lệnh – eckes

Trả lời

1

Vâng, vấn đề là tee thoát sau tệp lô của bạn và do đó mã thoát riêng của nó sẽ ghi đè một tệp lô.

Có (với kiến ​​thức của tôi) không nhiều bạn có thể làm về điều đó, ngoại trừ sử dụng một cơ chế xử lý lỗi khác. Bạn có thể sử dụng một biến môi trường để lưu trữ mã thoát của lô của bạn. tee sẽ không chạm vào điều đó.

1

Làm thế nào về:

FOR /F "tokens=1 delims=" %%A in ('find /c "ERRORVALUE: 1" %logDir%\03_applySqls.log') do SET val=%%A 
2

Nasty. Tôi chỉ có thể đề xuất một tệp bó bao bọc mà lấy đi mã thoát của lệnh được truyền. Một biến môi trường sẽ không hoàn toàn cắt mù tạt ở đây. Tôi đề nghị ghi nó vào một fd không sử dụng, nói 4.

wr.cmd:

call %* 
echo %errorlevel% >&4 
echo Some error message >&2 

Đây là một chút khôn lanh như fd 4 phải được mở khi wr.cmd được gọi. Để thử nghiệm sake, ở đây tôi echo Some error message để stderr để cho thấy rằng văn bản như vậy vẫn tách biệt với mức độ lỗi.

test1.bat:

call wr test2.bat 4>fail.txt 2>&1 | tee log.txt 
set /p fail= <fail.txt 
echo FAIL: %fail% 
Các vấn đề liên quan