Файл летучей мыши и этикетки - PullRequest
3 голосов
/ 03 ноября 2010

Я пытаюсь написать bat-файл для сетевой политики, которая установит программу, если она не существует, а также некоторые другие функции.Я использую операторы GOTO в зависимости от того, соответствует ли определенный критерий.Однако, похоже, что ярлыки не срабатывают правильно, как все они.

Я упростил свой сценарий, чтобы понять, что может происходить.

@echo off


IF EXIST c:\test\test.txt (GOTO :EXISTING) ELSE GOTO :MISSING

:EXISTING
echo file exists

:MISSING
echo file missing

ping localhost -n 5 >NUL

По сути, он проверяет, существует ли файл "test.txt" в папке "c: \ test", идентификатор которого существует.Так что должен эхо-файл существует для консоли.Однако и «файл существует», и «файл отсутствует» отображаются в консоли.Я обнаружил, что если я удаляю файл из папки или просто переименовываю его, он отображает только «отсутствует файл»

Почему он работает под обеими метками?

Ответы [ 5 ]

7 голосов
/ 03 ноября 2010

Поскольку GOTO - это просто прыжок в выполнении к точке в сценарии, то выполнение продолжается последовательно с этой точки. Если вы хотите, чтобы он остановился после запуска «СУЩЕСТВУЮЩЕГО», то вам нужно сделать что-то вроде этого. Обратите внимание на дополнительный GOTO и новый ярлык:

@ECHO OFF
IF EXIST c:\test\test.txt (GOTO :EXISTING) ELSE GOTO :MISSING

:EXISTING
echo file exists
goto :NEXTBIT

:MISSING
echo file missing

:NEXTBIT
ping localhost -n 5 >NUL

Стоит отметить, что с помощью cmd.exe (то есть командных оболочек на основе NT [NT, Win2k, XP и т. Д.]) Вы можете создавать блоки IF ... ELSE, например:

@ECHO OFF
IF EXIST c:\test\test.txt (
    ECHO File exists
) ELSE (
    ECHO File missing
)
ping localhost -n 5 >nul

... так что вы можете полностью устранить свои GOTO.

2 голосов
/ 03 ноября 2010

Это потому, что вам нужно пропустить пропущенный бит, если он существует:

    @echo off

    IF EXIST c:\test\test.txt (GOTO :EXISTING) ELSE GOTO :MISSING

:EXISTING
    echo file exists
    goto :COMMON

:MISSING
    echo file missing

:COMMON
    ping localhost -n 5 >NUL

Вы также можете иметь в виду, что текущий пакетный язык cmd.exe немного более мощный, чем тот, который шел с MS-DOS. Я бы предпочел этот:

@echo off
if exist c:\test\test.txt (
    echo file exists
) else (
    echo file missing
)
ping localhost -n 5 >nul
1 голос
/ 03 ноября 2010

Поскольку оператор GOTO перемещает выполнение к этой метке. Чтобы использовать его в вашей ситуации, вам нужно добавить еще один ярлык GOTO.

@echo off

IF EXIST c:\test\test.txt (GOTO :EXISTING) ELSE GOTO MISSING

:EXISTING
echo file exists
GOTO END

:MISSING
echo file missing
GOTO END

:END
ping localhost -n 5 >NUL
1 голос
/ 03 ноября 2010

После того, как ваш эхо-файл существует, следующая команда будет

echo file missing

Вам нужно что-то сделать, чтобы пропустить пропущенный случай.Возможно, еще один переход к метке: PING?

Когда вы отлаживаете, это помогает сохранить эхо.

0 голосов
/ 27 апреля 2018
@echo off

IF EXIST "c:\test\test.txt" ( :: warning double quotes

GOTO EXISTING
) ELSE (                      :: this format best in batch
GOTO MISSING
)                             :: don't forget

:EXISTING
echo file exists
goto OTHER                    :: if file exist jump OTHER

:MISSING
echo file missing
                              :: label is not required
:OTHER
timeout /t 5 >nul
pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...