Как создать пакетный файл с несколькими другими условиями? - PullRequest
0 голосов
/ 11 мая 2018

Я хотел создать командный файл с несколькими другими условиями и уже много искал, но мой не работает.Я хочу, чтобы файл проверял, существуют ли два файла и открывают ли один из этих файлов.Если один из двух файлов не существует, пакет должен сравнить следующие два файла.Мой файл выглядит так:

IF EXIST "file1.txt" IF EXIST "file2.txt" Goto V1

IF EXIST "file3.txt" IF EXIST "file4.txt" Goto V2

IF EXIST "file5.txt" AND IF EXIST "file6.txt" Goto V3

:V1
cd "folder"
start sample.exe
goto commonexit

:V2
cd "folder2"
start sample2.exe
goto commonexit

:V3
cd "folder3"
start sample3.exe
goto commonexit

:commonexit

Вот так cmd открывается и сразу закрывается.Когда я закомментирую ": commonexit", он открывается и работает через код, но кажется, что в условиях двойного IF (IF ... IF ...) он заботится только о втором IF.Помещение оператора AND между ними не помогает.

Кто-нибудь из вас догадывается, что может быть не так?

РЕДАКТИРОВАТЬ: работает: commonexit.Я просто не знал, что прерывание после: commonexit сделает код поврежденным.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вот альтернативное решение в одну строку, (разделенное на 3 для поддержания максимальной длины строки в 80 символов) , в котором используется команда Where:

(Where/Q "file1.txt"&&(Where/Q "file2.txt"&&Start /D "folder" "sample.exe"))||(
    Where/Q "file3.txt"&&(Where/Q "file4.txt"&&Start /D "folder2" "sample2.exe"
))||Where/Q "file5.txt"&&Where/Q "file6.txt"&&Start /D "folder3" "sample3.exe"
0 голосов
/ 12 мая 2018

Проще и ближе к исходному коду:

IF EXIST "file1.txt" IF EXIST "file2.txt" cd "folder" & start sample.exe & goto commonexit

IF EXIST "file3.txt" IF EXIST "file4.txt" cd "folder2" & start sample2.exe & goto commonexit

IF EXIST "file5.txt" IF EXIST "file6.txt" cd "folder3" & start sample3.exe & goto commonexit

rem Put here code that will execute when none of the previous paths execute...

:commonexit

РЕДАКТИРОВАТЬ : Добавлен новый метод

Новый метод нижепозволяет написать эффективную операцию «И» для нескольких тестов «EXIST filename» и связать несколько из этих тестов способом, аналогичным нескольким командам «ELSE IF»:

(for /F "skip=1" %%a in ('dir /B file1.txt file2.txt') do break) && (
   echo Both file1.txt and file2.txt exists
   echo Process they here
) || (for /F "skip=1" %%a in ('dir /B file3.txt file4.txt') do break) && (
   echo Both file3.txt and file4.txt exists
   echo Process they here
) || (for /F "skip=1" %%a in ('dir /B file5.txt file6.txt') do break) && (
   echo Both file5.txt and file6.txt exists
   echo Process they here
) || echo Last else

Этот метод основан назначение «ExitCode», возвращаемое командой for /F, как объяснено на в этом ответе (ниже раздел «Управление кодом выхода» раздел).Этот метод можно легко расширить на большее количество файлов, просто вставив дополнительные имена файлов и , настроив значение skip = 1 на количество файлов минус один.Например:

(for /F "skip=2" %%a in ('dir /B file1.txt file2.txt file3.txt') do break) && (
   echo All file1.txt, file2.txt and file3.txt exists
   echo Process they here
) || (for /F "skip=2" %%a in ('dir /B file4.txt file5.txt file6.txt') do break) && (
   echo All file4.txt, file5.txt and file6.txt exists
   echo Process they here
) || echo Last else
0 голосов
/ 11 мая 2018

Вот один из способов:

@echo  off
if exist "file1.txt" if exist "file2.txt" (
cd "folder"
start sample.exe
goto :EOF
)

if exist "file3.txt" if exist "file4.txt" (
cd "folder2"
start sample2.exe
goto :EOF
)

if exist "file5.txt" if exist "file6.txt" (
cd "folder3"
start sample3.exe
goto :EOF
)

Вот логика: file1 проверяется на наличие, если существует, проверьте, существует ли file2, если он существует, cd, выполните образец, а затем goto конец файла. Однако, если file1 или file2 не существует, он пропустит текущий блок кода и перейдет к следующей строке if '*

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...