2012-03-13 28 views
34

Tôi nghĩ rằng tôi đã gặp phải một lỗi trong kịch bản lệnh batch của Window.Biến hàng loạt của Windows sẽ không đặt

Tôi không thể đặt các biến nằm trong câu lệnh if được mở rộng.

Dưới đây là một phần không thể tách biệt của kịch bản của tôi:

@echo off 

set success=1 
set Version=12345 
set Target=Client 
set Type=456 
set dir= 
set zip= 

if "%Version%"=="" set success=0 
if "%Type%"=="" set success=0 

if 1==1 set test=42 

if %success%==1 (
    set test2=57005 
    if "%Target%"=="Client" (
     set dir=ModName v%Version% 
     set zip=ModName v%Version% %Type%.zip 
     echo Version: %Version% 
     echo Type: %Type% 
     echo. 
     echo Target: %Target% 
     echo  dir: %dir% 
     echo  zip: %zip% 
     echo. 
     echo test: %test% 
     echo test2: %test2% 
    ) 
) else (
    echo Not successful. 
) 

Đây là sản phẩm từ một thương hiệu thể hiện mới của cmd:

C:\Users\RandomClown\Desktop>test.bat 
Version: 12345 
    Type: 456 

Target: Client 
    dir: 
    zip: 

    test: 42 
    test2: 

Những gì bạn cần chú ý đó là các dòng lệnh if đặt đúng công cụ. Đa dòng nếu sẽ thực hiện bất kỳ thứ gì KHÔNG phải là bộ. Tôi không nghĩ rằng tôi đã bỏ lỡ bất cứ điều gì. Ngoài ra, câu lệnh if multiline đang thực hiện đúng các dòng bên phải vì các dòng else (echo Not successful.) không thực thi.

Tại sao các dòng không thực thi?

+0

wow đó là phản hồi nhanh. Nhìn vào nó ngay bây giờ. – RandomClown

+4

Có thể trùng lặp của [windows batch SET bên trong IF không hoạt động] (http://stackoverflow.com/questions/9102422/windows-batch-set-inside-if-not-working) – chwarr

+0

Chúng ta cần đặt câu hỏi này vào tiêu đề của 'batch-file'. – SteveFest

Trả lời

65

Bạn bỏ lỡ điều gì đó ;-)

cmd mở rộng biến khi lệnh là phân tích cú pháp, không phải khi họ đang chạy. Nó xảy ra như vậy là một tuyên bố if hoặc for với một khối (...) (hoặc thực sự bất kỳ khối nào) là một lệnh duy nhất trong trường hợp đó. Vì vậy, khi bạn đặt các biến bên trong một khối hãy thử sử dụng chúng trong cùng một khối không còn biến nào nữa - chúng được thay thế bằng các giá trị mà các biến có trước khi khối thậm chí được thực hiện.

Stick một

setlocal enabledelayedexpansion 

vào lúc bắt đầu của tập tin thực thi của bạn và sử dụng !zip! thay vì %zip%. Xem help set để có một cuộc thảo luận chi tiết về vấn đề này.

+0

o wow, không bao giờ biết điều đó. Cảm ơn vì kiến ​​thức! – RandomClown

+0

tnaks obrigdo !! – durtto

-1

Chỉ cần nhắc nhở, lệnh "set" ms-dos lấy mọi chuỗi sau dấu bằng. Vì vậy, nếu bạn viết

if "x"=="x" set a=foo else set a=bar 
echo %a% // output : foo else set a=bar 

% a% thực sự được đặt thành "foo else set a = bar", không foo. Vì vậy, tôi luôn luôn sử dụng "()" cho lệnh set nếu có nhiều lệnh trong một dòng.

if "%1"=="" (set a=20) else (set a=%1)  
+1

lệnh "set" không phải lúc nào cũng nhận mọi chuỗi sau dấu bằng. Ví dụ: đặt một = 1 & echo Hiya. Tốt điểm về dấu ngoặc đơn mặc dù, họ thực sự là siêu hữu ích. –

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