2012-06-23 33 views

Trả lời

22

Bạn có thể nghĩ rằng bạn có thể làm điều gì đó như sau, nhưng nó sẽ không hoạt động.

(nmake & call set myError=%%errorlevel%%) | tee output.txt 

Sự cố nằm trong cơ chế mà ống Windows hoạt động. Mỗi bên của đường ống được thực hiện trong vỏ CMD riêng của nó. Vì vậy, bất kỳ biến môi trường nào bạn đặt ở đó sẽ biến mất khi lệnh đã kết thúc. Ngoài ra việc mở rộng chậm trễ của% errorlevel% phức tạp hơn vì mức phân tích thêm, và vì trình bao CMD có ngữ cảnh dòng lệnh thay vì bối cảnh lô.

Bạn có thể làm một cái gì đó như thế này:

(nmake & call echo %%^^errorlevel%% ^>myError.txt) | tee output.txt 
for /f %%A in (myError.txt) do echo nmake returned %%A 
del myError.txt 

Hoặc bạn có thể nhúng các errorlevel trong output.txt của bạn:

(nmake & call echo nmakeReturnCode: %%^^errorlevel%%) | tee output.txt 
for /f "tokens=2" %%A in ('findstr /b "nmakeReturnCode:" output.txt') do echo nmake returned %%A 

Nhưng giải pháp đơn giản nhất có vẻ là

nmake >output.txt 
set myError=%errorlevel% 
type output.txt 
echo nmake returned %myError% 


Lưu ý - có nhiều biến chứng phức tạp khi làm việc với các ống Windows. Tham chiếu tốt là Why does delayed expansion fail when inside a piped block of code?. Tôi khuyên bạn nên đọc câu hỏi và tất cả các câu trả lời. Câu trả lời đã chọn có thông tin tốt nhất, nhưng các câu trả lời khác giúp cung cấp ngữ cảnh.

EDIT 2015-06-02

tôi vừa mới khám phá ra bạn có thể sử dụng các macro DOSKEY để sạch lưu trữ và lấy ERRORLEVEL từ một trong hai (hoặc cả hai) bên của một đường ống, mà không cần đến một tập tin tạm thời. Tôi có ý tưởng từ người dùng DosTips Ed Dyreen tại http://www.dostips.com/forum/viewtopic.php?p=41409#p41409. Các macro DOSKEY không thể được thực hiện thông qua hàng loạt, nhưng các định nghĩa vẫn tồn tại sau khi thoát ENDLOCAL và CMD/C!

Đây là cách bạn sẽ sử dụng nó trong tình huống của bạn:

(nmake & call doskey /exename=err err=%%^^errorlevel%%) | tee output.txt 
for /f "tokens=2 delims==" %%A in ('doskey /m:err') do echo nmake returned %%A 

Nếu bạn muốn, bạn có thể thêm lệnh thêm một lúc kết thúc để xóa các định nghĩa của err "vĩ mô" sau khi bạn đã truy xuất giá trị.

doskey /exename=err err= 
+0

Giải pháp đơn giản đánh bại lý do chính để sử dụng tee (đầu ra đồng thời). Ngoài ra đối với giải pháp đầu tiên, bạn có thể sử dụng "set/p MY_ERROR =

+0

Thỏa thuận với 'call set',' call echo' và vv? Tôi chưa từng thấy cú pháp này trước đây. – alecov

+1

@Alek - Đó là một hack cũ để có được một vòng thứ hai của mở rộng biến sau khi phân tích ban đầu. Nó là một thay thế cho việc sử dụng mở rộng chậm trễ. 'echo! var!' tương tự 'call echo %% var %%'. Trì hoãn trễ thường được ưu tiên, nhưng có những lúc cần CALL hack. – dbenham

Các vấn đề liên quan