2013-04-01 2 views
5

Хорошо, я пытаюсь сделать пару вложенных инструкций IF EXIST для проверки наличия пары папок. Если первая папка существует, установите Folder1 равным 1, а затем перейдите к Install. То же самое с Folder2, а затем, если ни одна из них не существует, просто пропустите, чтобы установить.Вложенные инструкции Exist в пакетном файле

Но даже если Folder1 не существует, это все равно устанавливает% Folder1% равным 1. Что мне не хватает/не делает?

Спасибо!

if exist "c:\folder1" set Folder1=1 
    echo %Folder1% 
    goto install 
else if exist "c:\folder2" set Folder2=1 
    echo %Folder2% 
    goto Install 
else goto Install 

:Install 

ответ

11

две основные проблемы:

должно быть заключено в скобки Составной оператор. В круглых скобках изменение значения переменной НЕ будет видимым, ЕСЛИ вы не выполнили SETLOCAL ENABLEDELAYEDEXPANSION - и даже тогда вам нужно будет использовать! Var! не% Var%

Итак:

SETLOCAL ENABLEDELAYEDEXPANSION 
if exist "c:\folder1" (
     set Folder1=1 
     echo !Folder1! 
     goto install 
) else if exist "c:\folder2" (
     set Folder2=1 
     echo !Folder2! 
     goto Install 
) else goto Install 

:Install 

Или предпочтительно,

@ECHO off 
if exist "c:\folder1" (
     set Folder1=1 
     goto install 
) else if exist "c:\folder2" (
     set Folder2=1 
     goto Install 
) else goto Install 

:Install 

SET folder 

Или еще проще

@ECHO off 
if exist "c:\folder1" set Folder1=1&goto install 
if exist "c:\folder2" set Folder2=1&goto Install 
:Install 

SET folder 

Тест:

@ECHO OFF 
setlocal 
SET "folder1=" 
SET "folder2=" 
ECHO.----------No folders 
DIR /b /ad c:\folder* 
CALL :test 
ECHO.----------Folder 1 only 
MD c:\folder1 
DIR /b /ad c:\folder* 
CALL :test 
ECHO.----------Folder 2 only 
RD c:\folder1 
MD c:\folder2 
DIR /b /ad c:\folder* 
CALL :test 
ECHO.----------Both 
MD c:\folder1 
DIR /b /ad c:\folder* 
CALL :test 
RD c:\folder1 
RD c:\folder2 

GOTO :eof 

:test 
if exist "c:\folder1" set Folder1=1&goto install 
if exist "c:\folder2" set Folder2=1&goto Install 
:Install 

SET folder 
SET "folder1=" 
SET "folder2=" 
GOTO :eof 

Этот тест создает и удаляет указанные два каталога.

Вот результат:

----------No folders 
----------Folder 1 only 
folder1 
Folder1=1 
----------Folder 2 only 
folder2 
Folder2=1 
----------Both 
folder1 
folder2 
Folder1=1 

Обратите внимание, что

SET "folder1=" 
    SET "folder2=" 

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

+0

Эта система комментариев отстой (если я не знаю, как использовать эту систему комментариев). Питер, я попробовал ваше простое решение, но всегда устанавливал бы Folder1 равным 1, даже если C: \ Folder1 не существовал. – Brian

+0

По всей вероятности, переменные были SET с помощью предыдущего прогона. Переменные должны быть явно не предназначены для удаления из среды. Вот почему в большинстве пакетных программ есть 'SETLOCAL' сразу после' @echo off'. С помощью 'setlocal' любые изменения среды отменяется, когда заканчивается процедура. – Magoo

+0

ОК, я не делал SET «folder1 =» до нуля, или SETLOCAL. Поэтому, возможно, я использовал устаревшие данные. Позвольте мне попробовать это снова. – Brian

1
if exist "c:\folder1" (
     set Folder1=1 
     echo %Folder1% 
     goto install 
) if exist "c:\folder2" (
     set Folder2=1 
     echo %Folder2% 
     goto Install 
) else goto Install 

:Install 
0

Этот код не устанавливает% folder1% = 1, если folder1 не существует, и в этом случае он не выводит результат. Если Folder1 не существует И Папка2 существует THEN% folder2% установлен в 1, в противном случае% folder2% пуст. Поместите незамкнутые левые круглые скобки после команды echo для подавления вывода, если переменная пуста.

@echo off &setlocal 
if exist "c:\folder1" set "Folder1=1" 
echo(%Folder1% 
if not defined Folder1 if exist "c:\folder2" set "Folder2=1" 
echo(%Folder2% 
goto Install 

:Install 
endlocal 
+0

Это решение, похоже, работает, хотя и сложнее/code. Мне придется протестировать еще несколько, но похоже, что это будет работать как для присутствующей папки Folder1, так и для папки2 или присутствовать. – Brian

+0

Это работает как ** else ** и тесты только для папки2, если папка1 не существует. – Endoro

Смежные вопросы