đặt ERRORLEVEL thành 0


14

Tôi có một tệp bó là một trình bao bọc xung quanh trình cài đặt. Tệp bó này kiểm tra mức lỗi được trình cài đặt trả về và in tương ứng.

Tôi nhận thấy rằng nếu tôi thực thi set ERRORLEVEL=0trong một dấu nhắc lệnh ngay trước khi khởi động tệp bó (trong cùng một cửa sổ lệnh / môi trường), trình cài đặt không bao giờ gây rối với errorlevel và tập lệnh bó của tôi luôn được trả về. Tôi giả sử %ERRORLEVEL%là một biến được xác định bởi Windows và được sử dụng cụ thể để in ra các lỗi từ các chương trình và tập lệnh và việc sử dụng biến đó trong một tệp bó hoặc một cái gì đó sẽ là 'nguy cơ của riêng bạn' bởi vì nó có thể bị thay đổi bất cứ lúc nào một quá trình khác.

Từ những gì có vẻ như, khi tôi đặt errorlevel trong môi trường đã cho, thì bằng cách nào đó nó chấm dứt việc sử dụng errorlevel như một người giữ mã thoát. Có ai biết tại sao điều này? Đối với tôi nó chỉ là hành vi bất ngờ kỳ lạ. Bất kỳ thông tin về chủ đề này sẽ được đánh giá rất cao!


Câu trả lời:


14

Bạn đang xác định lại biến hệ thống thành một biến thông thường. Khi bạn làm điều này, hệ thống sẽ không sử dụng nó cho đến khi phiên lệnh được đóng lại.

Cách tốt nhất là sử dụng

exit /b 0

trong một tệp bó khác và gọi nó từ tập lệnh chính của bạn. Trong đó số 0 là mong muốn của bạn errorlevel. Hoặc là hoặc sử dụng một lệnh đặt lại errorlevelcho bạn, chẳng hạn như echo, findstr, v.v.

Ví dụ: tất cả các lệnh sau sẽ được đặt ERRORLEVELthành 0 trong tệp bó của bạn:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
Gần đúng. Bạn có thể có được "hệ thống" để sử dụng ERRORLEVEL động chỉ bằng cách xác định bất kỳ giá trị nào do người dùng xác định bằng cách sử dụngset "errorlevel="
dbenham

Tại sao Windows cho phép ai đó xác định lại một biến hệ thống thành một biến thông thường? Cả hai định nghĩa vẫn còn tồn tại, nó chỉ là tiếng vang và các lệnh khác như vậy bây giờ chỉ đến một định nghĩa thông thường? Vì vậy, các chương trình vẫn có thể cập nhật biến hệ thống, nó chỉ không thể truy cập thông qua dấu nhắc lệnh?
dùng972276

1
"Hoặc là hoặc sử dụng một lệnh đặt lại errorlevel cho bạn, chẳng hạn như echo, findstr, v.v." Lệnh echo không thiết lập lại biến errorlevel.
antred

Như những người khác đã nói, nếu errorlevel biến đã được người dùng / đợt đặt "thủ công" "set errorlevel=0", errorlevelbiến đó sẽ không còn phản ánh mã thoát, nhưng bạn vẫn có thể truy cập mã thoát if errorlevel do something.
Kevin Fegan

(1) Một câu hỏi tổng quát hơn là về Làm thế nào để tôi đặt ERRORLEVEL thành một số giá trị tùy ý, chẳng hạn như 42?  cmd /c exit 42 dường như là câu trả lời tốt nhất cho điều đó (2) Như  dbenham chỉ ra , bạn không cần  /bhoặc trích dẫn.
Scott

12

Bạn không bao giờ nên gán giá trị của riêng mình cho các biến hệ thống động như ERRORLEVEL, PATH, CD, DATE, TIME, v.v. Làm như vậy sẽ ngăn mã nhìn thấy giá trị động. Bạn có thể khôi phục giá trị động bằng cách đơn giản xác định giá trị do người dùng xác định. Ví dụ:

set "errorlevel="

Nếu bạn muốn buộc errorlevel thành 0, thì bạn có thể sử dụng cú pháp hoàn toàn không trực quan nhưng rất hiệu quả này : (call ). Không gian sau cuộc gọi là rất quan trọng. Nếu bạn muốn đặt errorlevel thành 1, bạn có thể sử dụng (call). Điều quan trọng là không có bất kỳ khoảng trống nào sau cuộc gọi.

(call)
echo %errorlevel%
(call )
echo %errorlevel%

Một phương pháp trực quan hơn nhưng ít tiện lợi hơn để đặt errorlevel là sử dụng chương trình con chuyên dụng trong một tệp bó:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

Hoặc nếu trên dòng lệnh, bạn có thể sử dụng

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%

7

Cá nhân tôi sử dụng cái này:

cd .

Hoạt động ngay cả trong vỏ unix.


Nhưng, điều này có thể nhanh hơn một chút: type nul>nulBởi vì Trình giám sát quy trình hiển thị QueryDirectorycác cuộc gọi trên cd .PS: cd .có một hiệu ứng phụ đẹp mắt khác trong trình bao unix. Nó sẽ khôi phục thư mục làm việc được tạo lại trong thiết bị đầu cuối nếu nó đã được mở trước khi xóa.
Andry

2

Dưới đây là một số cách khác để đặt lại ErrorLeveltrạng thái, thậm chí hoạt động trong MS-DOS (ít nhất là cho phiên bản 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Các phương pháp sau chỉ hoạt động trong MS-DOS:

command /? > nul

fc nul nul > nul

Để hoàn thiện, điều này đặt ErrorLeveltrạng thái 1, hợp lệ cho cả Windows và MS-DOS:

< nul find ""

1

Đây là điều duy nhất tôi đã tìm thấy hoạt động.

call (exit /b 0)

Cần nó trong một tập lệnh sử dụng tập lệnh bên thứ 3 phát hiện ERRORLEVEL, nhưng không tự đặt lại mức độ lỗi của nó.


0

Những thứ này cũng sẽ hoạt động: (Đặt errorlevel thành 1)

Phương pháp 1

color 00

Cách 2

echo A | find "B"

Bạn cũng có thể sử dụng điều này để đặt errorlevel 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.