(было неожиданно в это время - пакетный скрипт - PullRequest
11 голосов
/ 21 марта 2012

Я использую пакетный скрипт ниже и получаю сообщение об ошибке

(в это время было неожиданно.

Я знаю, что проблема в первой строкено я не понимаю, что не так. Есть идеи?

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 
)

Ответы [ 3 ]

17 голосов
/ 21 марта 2012

На самом деле проблема в , а не в первой строке.

Проблема в том, что cmd выполняет подстановку переменных сразу же после анализа оператора IF, включая его тело. Поэтому строка:

IF %isDefault%==y (

проблематично, потому что isDefault не устанавливается, когда внешний оператор IF анализируется, поэтому он становится:

IF ==y (

и, следовательно, вы получаете сообщение о том, что ( неожиданно. Вы можете обойти это, включив расширение команды (SETLOCAL ENABLEDELAYEDEXPANSION) для отложенное расширение переменной среды (подробности см. set /?). Вы также можете переписать свой скрипт:

@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

(я сделал некоторые другие изменения, такие как использование встроенной метки :EOF вместо :END.)

4 голосов
/ 21 марта 2012

Как сказал jamesdlin, это проблема с пустыми переменными, а также с delayedExpansion.
Тогда решение простое, если заменить %isDefault% на !isDefault!, это работает, даже если isDefault пусто.

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 
)
1 голос
/ 14 ноября 2017

У меня была очень похожая проблема и конструкция кода, которая доставляла мне много боли. Мое сообщение об ошибке было ". В это время было неожиданно" ...

Мне потребовалось несколько долгих дней, чтобы выяснить еще одно подобное соображение из-за этой проблемы ... Пожалуйста, посмотрите на следующую проблему и последующее решение здесь: ". Было неожиданно в это время", сгенерированное из партии строка сценария 'если существует [файл] (...

Решением была просто обработка '(' и ')' в строках ECHO внутри блока операторов IF.

Суть в том, что можно рассматривать обработку специальных символов как возможный источник проблемы при устранении неполадок в операторах IF (и, возможно, FOR).

HTH кто-то ...

...