Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

( was unexpected at this time - batch script

I'm using the batch script below and get an error

( was unexpected at this time.

I know that the problem is in the first line but I don't understand what is wrong. Any ideas ?

script:

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 
)
like image 348
choppy Avatar asked Mar 21 '12 06:03

choppy


3 Answers

I had a very similar problem and code construct that was causing me a lot of pain to resolve. My error message was ". was unexpected at this time"...

It took me a couple long days to figure out another similar consideration due to this problem... Please take a look a the following problem and subsequent solution here: ". was unexpected at this time" generated from batch script line 'if exist [file] (...

The solution was simply the treatment of '(' and ')' on ECHO lines inside an IF statement block.

The point is, do consider treatment of special characters as a possible source of a problem when troubleshooting IF (and possibly FOR) statements.

HTH someone...

like image 87
sw.smayer97 Avatar answered Sep 18 '22 15:09

sw.smayer97


Actually, the problem is not on the first line.

The problem is that cmd does variable substitution immediately when it parses the IF statement, including its body. Therefore the line:

IF %isDefault%==y (

is problematic because isDefault isn't set when the outer IF statement is parsed, so it becomes:

IF ==y (

and hence you get the error about ( being unexpected. You can get around this by enabling the command extension (SETLOCAL ENABLEDELAYEDEXPANSION) for delayed environment variable expansion (see set /? for details). You also can rewrite your script:

@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

(I made some other changes, such as using the built-in :EOF label instead of :END.)

like image 18
jamesdlin Avatar answered Nov 04 '22 07:11

jamesdlin


As jamesdlin said, it's a problem with empty variables and also with delayedExpansion.
Then the solution is simple by replacing %isDefault% with !isDefault!, this works even if isDefault is empty.

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 
)
like image 4
jeb Avatar answered Nov 04 '22 07:11

jeb