2013-04-01 16 views
5

Ok, próbuję wykonać zagnieżdżone instrukcje IF EXIST, aby sprawdzić obecność kilku folderów. Jeśli pierwszy folder istnieje, ustaw Folder1 na równe 1, a następnie przejdź do Instaluj. To samo dotyczy Folder2, a jeśli żaden z nich nie istnieje, po prostu przejdź do instalacji.Zagnieżdżone, jeśli istnieją instrukcje w pliku wsadowym

Ale nawet gdy Folder1 nie istnieje, to nadal ustawia% Folder1% na równe 1. Czego mi brakuje/nie robię?

Dzięki!

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 

Odpowiedz

11

dwa podstawowe problemy:

Oświadczenie związek musi być parenthesised. W nawiasach, zmiana wartości zmiennej NIE będzie widoczna, BEZ wykonania SETLOCAL ENABLEDELAYEDEXPANSION - i nawet wtedy musisz użyć! Var! Nie% var%

Więc:

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 

lub korzystnie

@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 

Albo jeszcze prościej

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

SET folder 

Test:

@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 

Ten test tworzy i usuwa dwa katalogi, o których mowa.

Oto wynik:

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

Zauważ, że

SET "folder1=" 
    SET "folder2=" 

który jest wykonywany zarówno na początku jak i po każdym raporcie zapewnia, że ​​zmienne środowiskowe w pytaniu są usuwane ze środowiska uniemożliwiają kod podający fałszywe wyniki na nieaktualnych informacjach.

+0

Ten system komentowania jest do niczego (chyba że nie wiem, jak korzystać z tego systemu komentowania). Peter, próbowałem twojego prostego rozwiązania, ale zawsze ustawiał Folder1 na równe 1, nawet jeśli C: \ Folder1 nie istniał. – Brian

+0

Najprawdopodobniej zmienne zostały ustawione przed poprzednim uruchomieniem. Zmienne muszą być wyraźnie ustawione na nic, aby usunąć je ze środowiska. Właśnie dlatego większość programów wsadowych ma tutaj 'SETLOCAL' natychmiast po' @echo off'. W przypadku 'setlocal' wszelkie zmiany środowiska są cofane, gdy kończy się procedura. – Magoo

+0

OK, nie robiłem SET "folder1 =", aby wyzerować wcześniej, ani SETLOCAL. Więc może używałem nieaktualnych danych. Pozwól mi spróbować jeszcze raz. – 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

Ten kod nie ustawia% folder1% = 1, jeśli folder1 nie istnieje i nie tworzy w tym przypadku żadnych danych wyjściowych. Jeśli Folder1 nie istnieje ORAZ Folder2 istnieje THEN% folder2% ma wartość 1, w przeciwnym razie% folder2% jest pusty. Umieść niezamknięte lewe nawiasy po poleceniu echo, aby wyłączyć wyjście, jeśli zmienna jest pusta.

@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

To rozwiązanie wydaje się działać, chociaż bardziej skomplikowane/kod. Będę musiał przetestować trochę więcej, ale wygląda na to, że to zadziała, ponieważ obecny jest Folder1, folder2 jest obecny, albo żaden nie jest obecny. – Brian

+0

Działa to jak ** else ** i testy tylko dla folderu 2, jeśli folder1 nie istnieje. – Endoro

Powiązane problemy