2013-04-01 6 views
5

Ok, ich versuche ein paar verschachtelt zu tun IF EXIST-Anweisungen für die presense von ein paar Ordner zu überprüfen. Wenn der erste Ordner vorhanden ist, legen Sie Ordner1 auf 1 fest, und wechseln Sie dann zu Installieren. Gleiches gilt für den Ordner "Ordner2". Wenn keiner der Ordner vorhanden ist, überspringen Sie einfach die Installation.Verschachtelte Wenn Exist-Anweisungen in Batch File

Aber selbst wenn Folder1 nicht vorhanden ist, setzt dies noch% Folder1% 1. bis gleich Was ich/nicht tue fehlt?

Danke!

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 

Antwort

11

zwei grundlegende Probleme:

Verbindung Anweisung muss parenthesised werden. In Klammern ist das Ändern eines Variablenwerts NICHT sichtbar, AUSSER Sie haben SETLOCAL ENABLEDELAYEDEXPANSION ausgeführt - und selbst dann müssten Sie! Var! Also nicht% 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 

oder vorzugsweise

@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 

Oder noch einfacher

@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 

Dieser Test erstellt und löscht die beiden betroffenen Verzeichnisse.

Hier ist das Ergebnis:

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

Beachten Sie, dass

SET "folder1=" 
    SET "folder2=" 

, die sowohl am Anfang und nach jedem Bericht ausgeführt wird, stellt sicher, dass die Umgebungsvariablen in Frage aus der Umgebung entfernt werden, um zu verhindern Code, der bei veralteten Informationen falsche Ergebnisse liefert.

+0

Dieses Kommentar-System saugt (Es sei denn, ich weiß nicht, wie Sie dieses Kommentar-System verwenden). Peter, ich habe deine einfache Lösung ausprobiert, aber es würde immer Folder1 auf 1 setzen, auch wenn C: \ Folder1 nicht existiert. – Brian

+0

Die Variablen wurden aller Wahrscheinlichkeit nach von einem vorherigen Lauf gesetzt. Variablen müssen explizit auf nichts gesetzt werden, um sie aus der Umgebung zu entfernen. Deshalb haben die meisten Batch-Programme sofort nach dem @echo off einen 'SETLOCAL'. Mit 'setlocal' werden alle Umgebungsänderungen rückgängig gemacht, wenn die Routine endet. – Magoo

+0

OK, ich habe nicht das SET "folder1 =" gemacht, um vorher Null, noch das SETLOCAL. Vielleicht benutzte ich also veraltete Daten. Lass mich das nochmal versuchen. – 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

Dieser Code nicht gesetzt% folder1% = 1, wenn folder1 nicht nicht vorhanden ist, und es erzeugt keine Ausgabe in diesem Fall. Wenn Folder1 existiert nicht UND Folder2 existiert DANN% folder2% auf 1 gesetzt ist, sonst% folder2% leer. Fügen Sie eine nicht geschlossene linke Klammer nach dem Befehl echo ein, um die Ausgabe zu unterdrücken, wenn eine Variable leer ist.

@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

Diese Lösung scheint zu funktionieren, obwohl komplizierter/Code. Ich muss etwas mehr testen, aber es sieht so aus, als würde dies funktionieren, wenn sowohl Ordner1 vorhanden ist, Ordner2 vorhanden ist oder keiner vorhanden ist. – Brian

+0

Dies funktioniert wie ** sonst ** und testet nur für Ordner2, wenn Ordner1 nicht existiert. – Endoro

Verwandte Themen