Trong ví dụ dưới đây, tôi thực hiện nmake và sau đó chuyển hướng STDOUT/STDERR sang tee, sau đó gửi nó tới màn hình và cũng đến tệp nhật ký. Vấn đề là tôi đang cố gắng nắm bắt mã thoát cho nmake chứ không phải tee. Điều tôi cần là mã thoát khỏi nmake và không phải là tee.Trình thông dịch lệnh của Windows: cách lấy mã thoát của lệnh đường ống đầu tiên
Trả lời
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=
- 1. Đầu ra của lệnh đường ống, nhưng giữ mã lỗi
- 2. -Mã thoát của mã lệnh không giống như mã thoát của mã lệnh
- 3. Làm cách nào để lấy mã thoát của lệnh chứ không phải lệnh xterm?
- 4. Lấy mã thoát từ subshell qua các đường ống
- 5. Đầu ra của đường ống để cắt
- 6. Lệnh xuất khẩu đường ống
- 7. Mã thoát của lệnh chuyển hướng
- 8. đầu ra đường ống của quy trình con.Chọn các tệp
- 9. Lấy đầu ra của lệnh Shell trong VB.net
- 10. Cách lấy đầu ra của lệnh bash trong biến
- 11. Lấy mã thoát cho lệnh eval trong sh
- 12. Đường ống vào đầu vào của findstr
- 13. Cách chuyển hướng đầu ra của lệnh shell vào đầu vào tập lệnh Python?
- 14. Cách lấy dòng đầu tiên của tệp trong tập lệnh bash?
- 15. Đầu ra của lệnh shell cuối cùng
- 16. Đặt đầu ra của lệnh dưới dạng biến (có đường ống)
- 17. Trình biên dịch bỏ qua dấu ngoặc đơn còn thiếu của lệnh Thoát
- 18. Cách kéo đường dẫn vật lý của Dịch vụ Windows bằng lệnh Get-Service
- 19. Đối số dòng lệnh của Dịch vụ Windows Delphi
- 20. Tìm đường dẫn đầy đủ của trình thông dịch Python?
- 21. Nối các tệp văn bản với dòng lệnh của Windows, thả các dòng đầu tiên
- 22. Đầu ra ống từ lệnh shell đến tập lệnh python
- 23. Bỏ qua $ ở đầu tiên của các lệnh
- 24. Lệnh batch của Windows để đọc dòng đầu tiên từ tệp văn bản
- 25. Đầu ra của chương trình đường ống đến ít hơn không hiển thị đầu ra của
- 26. Có OK để sử dụng cùng một tệp đầu vào như đầu ra của lệnh đường ống không?
- 27. Lệnh chống ma sát với đường ống
- 28. Tùy chọn cho | (đường ống) lệnh
- 29. Biểu thức chỉ được phép làm phần tử đầu tiên của đường ống
- 30. Cách lấy phần tử đầu tiên của tiêu chuẩn :: set
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 =
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
@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