2012-03-21 14 views
11

Tôi đang sử dụng các tập lệnh batch dưới đây và nhận được một lỗi(đã bất ngờ vào thời điểm này - batch script

(đã bất ngờ vào thời điểm này

Tôi biết rằng vấn đề là ở. dòng đầu tiên nhưng tôi không hiểu những gì là sai Bất kỳ ý tưởng

kịch bản:.?

IF [%1]==[] (
    :LOOP1 
    SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local  Area Connection 2]?[y/n] 
    IF %isDefault%==y (
     SET from=1 
     SET step=1 
     SET to=10 
     SET lan="Local Area Connection 2" 
     GOTO :USERLOOP 
    ) 
    IF %isDefault%==n GOTO :END 
    GOTO :LOOP1 
) 

Trả lời

15

Thực ra, vấn đề là không phải trên dòng đầu tiên.

Vấn đề là cmd thay thế ngay lập tức khi nó phân tích cú pháp câu hỏi IF, bao gồm cả nội dung của nó. Do đó dòng:

IF %isDefault%==y (

là vấn đề vì isDefault không được thiết lập khi bên ngoài tuyên bố IF được phân tách, vì vậy nó trở thành:

IF ==y (

và do đó bạn sẽ có được các lỗi về ( là bất ngờ. Bạn có thể giải quyết vấn đề này bằng cách bật tiện ích mở rộng lệnh (SETLOCAL ENABLEDELAYEDEXPANSION) để mở rộng biến môi trường bị trễ (xem set /? để biết chi tiết). Bạn cũng có thể viết lại kịch bản của bạn:

@ECHO OFF 
IF NOT "%1"=="" GOTO :EOF 

:LOOP1 
SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local Area Connection 2]?[y/n] 
IF "%isDefault%"=="y" (
    SET from=1 
    SET step=1 
    SET to=10 
    SET lan="Local Area Connection 2" 
    GOTO :USERLOOP 
) 
IF "%isDefault%"=="n" GOTO :EOF 
GOTO :LOOP1 

(. Tôi đã thực hiện một số thay đổi khác, chẳng hạn như sử dụng được xây dựng trong :EOF nhãn thay vì :END)

+0

Bạn có nghĩa là 'SETLOCAL ENABLEDELAYEDEXPANSION', tất nhiên. –

+0

@AndriyM: Argh. Phải, tất nhiên. Đã sửa. – jamesdlin

+0

Bạn đã thay đổi đáng kể hành vi dự định bằng câu lệnh IF đầu tiên của mình. Tôi không thể chắc chắn, nhưng nó có lẽ nên đọc 'NẾU KHÔNG "% ~ 1" == "" GOTO: USERLOOP'.Bạn giả sử không có mã sau nhãn ': END' - có lẽ có mã dọn dẹp ở cuối phải được thực hiện, vì vậy' GOTO: EOF' có thể không chính xác. – dbenham

4

Như jamesdlin nói, đó là một vấn đề với các biến rỗng và cũng với delayExpansion.
Sau đó, giải pháp đơn giản bằng cách thay thế %isDefault% bằng !isDefault!, điều này hoạt động ngay cả khi isDefault trống.

setlocal EnableDelayedExpansion 
IF [%1]==[] (
    :LOOP1 
    SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local  Area Connection 2]?[y/n] 
    IF !isDefault!==y (
     SET from=1 
     SET step=1 
     SET to=10 
     SET lan="Local Area Connection 2" 
     GOTO :USERLOOP 
    ) 
    IF !isDefault!==n GOTO :END 
    GOTO :LOOP1 
) 
+0

Jeb - làm thế nào nghịch ngợm của bạn bảo quản nhãn goto trong một khối IF :) Tôi nhận ra rằng mã sẽ làm việc tốt như bằng văn bản. Nhưng choppy sẽ nhận được một bất ngờ thô lỗ nếu anh/cô ấy nghĩ rằng điều này là ok, và sau đó làm như vậy khi có một điều khoản ELSE. @choppy - đọc câu hỏi này và câu trả lời của tôi để xem những gì tôi đang đề cập đến: [(Windows lô) Goto bên trong nếu khối hoạt động rất lạ] (http://stackoverflow.com/questions/8481558/windows-batch-goto-within -if-block-cư xử-rất kỳ lạ) – dbenham

0

Tôi đã gặp sự cố và cấu trúc mã rất giống nhau khiến tôi rất đau đớn phải giải quyết. Thông báo lỗi của tôi là ". Đã bất ngờ tại thời điểm này" ...

Tôi mất một vài ngày để tìm ra một xem xét tương tự khác do sự cố này ... Vui lòng xem xét vấn đề sau và giải pháp tiếp theo ở đây: ". was unexpected at this time" generated from batch script line 'if exist [file] (...

Giải pháp đơn giản là xử lý '(' và ')' trên các dòng ECHO bên trong khối câu lệnh IF.

Vấn đề là, xem xét việc xử lý các ký tự đặc biệt như một nguồn có thể có của một vấn đề khi xử lý các câu lệnh IF (và có thể FOR).

HTH ai đó ...