2011-12-22 20 views
6

Tôi đang cố gắng tạo một tệp lô thực hiện lệnh 'choice' khác nhau dựa trên phiên bản Windows đang được thực thi. Cú pháp của lệnh lựa chọn khác nhau giữa Windows 7 và Windows XP.Số lần trả lời lỗi của lệnh 'choice' của hàng loạt 0

Choice lệnh trả về một 1 cho Y và 2 cho N. Các lệnh sau đây trả về mức độ chính xác lỗi:

Windows 7:

choice /t 5 /d Y /m "Do you want to automatically shutdown the computer afterwards " 
echo %errorlevel% 
if '%errorlevel%'=='1' set Shutdown=T 
if '%errorlevel%'=='2' set Shutdown=F 

Windows XP:

choice /t:Y,5 "Do you want to automatically shutdown the computer afterwards " 
echo %ERRORLEVEL% 
if '%ERRORLEVEL%'=='1' set Shutdown=T 
if '%ERRORLEVEL%'=='2' set Shutdown=F 

Tuy nhiên , khi nó được kết hợp với một lệnh để phát hiện phiên bản hệ điều hành Windows, errorlevel trả về 0 trước AN sau khi lệnh lựa chọn trong cả hai khối mã Windows XP và Windows 7 của tôi.

REM Windows XP 
ver | findstr /i "5\.1\." > nul 
if '%errorlevel%'=='0' (
set errorlevel='' 
echo %errorlevel% 
choice /t:Y,5 "Do you want to automatically shutdown the computer afterwards " 
echo %ERRORLEVEL% 
if '%ERRORLEVEL%'=='1' set Shutdown=T 
if '%ERRORLEVEL%'=='2' set Shutdown=F 
echo. 
) 

REM Windows 7 
ver | findstr /i "6\.1\." > nul 
if '%errorlevel%'=='0' (
set errorlevel='' 
echo %errorlevel% 
choice /t 5 /d Y /m "Do you want to automatically shutdown the computer afterwards " 
echo %errorlevel% 
if '%errorlevel%'=='1' set Shutdown=T 
if '%errorlevel%'=='2' set Shutdown=F 
echo. 
) 

Như bạn có thể thấy, tôi thậm chí đã thử xóa biến errorlevel trước khi thực hiện lệnh lựa chọn, nhưng errorlevel vẫn ở 0 sau khi lệnh lựa chọn được thực thi.

Bất kỳ mẹo nào? Cảm ơn!

Trả lời

13

Bạn đã gặp phải sự cố cổ điển - Bạn đang cố gắng mở rộng %errorlevel% trong một khối mã được chặn. Dạng mở rộng đó xảy ra ở thời gian phân tích cú pháp, nhưng toàn bộ cấu trúc IF được phân tích cú pháp cùng một lúc, do đó giá trị của %errorlevel% sẽ không thay đổi.

Giải pháp đơn giản - chậm trễ. Bạn cần SETLOCAL EnableDelayedExpansion ở trên cùng, sau đó sử dụng !errorlevel! thay thế. Trì hoãn trễ xảy ra vào thời gian thực hiện, do đó bạn có thể thấy các thay đổi đối với giá trị trong dấu ngoặc đơn.

Trợ giúp cho SET (SET /?) mô tả sự cố và giải pháp liên quan đến câu lệnh FOR, nhưng khái niệm này giống nhau.

Bạn có các tùy chọn khác.

Bạn có thể di chuyển mã từ bên trong nội dung của IF đến các phần mã được gắn nhãn mà không có dấu ngoặc đơn và sử dụng GOTO hoặc CALL để truy cập mã. Sau đó, bạn có thể sử dụng %errorlevel%. Tôi không thích tùy chọn này vì CALLGOTO tương đối chậm và mã ít thanh lịch hơn.

Một tùy chọn khác là sử dụng IF ERRORLEVEL N thay vì IF !ERRORLEVEL!==N. (Xem IF /?) Bởi vì IF ERRORLEVEL N kiểm tra nếu errorlevel là> = N, bạn cần thực hiện các thử nghiệm theo thứ tự giảm dần.

REM Windows XP 
ver | findstr /i "5\.1\." > nul 
if '%errorlevel%'=='0' (
    choice /t:Y,5 "Do you want to automatically shutdown the computer afterwards " 
    if ERRORLEVEL 2 set Shutdown=F 
    if ERRORLEVEL 1 set Shutdown=T 
) 
Các vấn đề liên quan