didie08
Goto Top

if Schleifen

Wert einer Variablen in einer batch mit dem If Befehl untersuchen.

Hallo,

Ich möchte in abhängigkeit vom Wert einer Systemvariablen bestimmte Befehle ausführen. Dazu habe ich mir gedacht mit einer If Schleife den Wert der Variablen zu ermitteln.

Bisher Code sieht bisher folgendermasen aus
IF (%EmpirumServer% == "de301386"  ECHO hallo1 >>C:\Temp\test.txt   
	) ELSEIF ( 
	%EmpirumServer% == "10.193.174.81" ECHO hallo2 >>C:\Temp\text.txt  
	) ELSE (
	ECHO keinhallo >>C:\Temp\text.txt
)
Leider scheint das vom Syntax her nicht in Ordnung zu sein. Kann mir jemand sagen wie das richtig aussehen muss damit es funktioniert

Gruß
didie08

Content-ID: 94789

Url: https://administrator.de/forum/if-schleifen-94789.html

Ausgedruckt am: 23.12.2024 um 13:12 Uhr

bastla
bastla 19.08.2008 um 16:04:53 Uhr
Goto Top
Hallo didie08!

Etwa so:
IF /i "%EmpirumServer%"=="de301386" (ECHO hallo1 >>C:\Temp\test.txt   
	) ELSE (
		IF "%EmpirumServer%"=="10.193.174.81" (ECHO hallo2 >>C:\Temp\test.txt  
	) ELSE (
		ECHO keinhallo >>C:\Temp\test.txt
	)
)
Soferne der Inhalt der Variablen %EmpirumServer% bereits unter Anführungszeichen steht, kannst Du sie bei der "if"-Abfrage natürlich weglassen.

[Edit] Etwas übersichtlicher geht's eigentlich auch noch:
IF /i "%EmpirumServer%"=="de301386" (  
	ECHO hallo1 >>C:\Temp\test.txt 
) ELSE (
	IF "%EmpirumServer%"=="10.193.174.81" (  
		ECHO hallo2 >>C:\Temp\test.txt
	) ELSE (
		ECHO keinhallo >>C:\Temp\test.txt
	)
)
[/Edit]

Grüße
bastla
didie08
didie08 19.08.2008 um 16:37:03 Uhr
Goto Top
Hallo bastla

Danke für die schnelle Antwort.

Es hat funktioniert.
Aber wie muss das ganze Aussehen wenn %EmpirumServer% 5 verschiedene Werte haben kann.

Ich habe bei meinem Beispiel mal eine 3 Variante angefügt und schon ging es nicht mehr.

IF /i "%EmpirumServer%"=="de301386" (ECHO hallo1 >>C:\Temp\test.txt  
	) ELSE (
		IF "%EmpirumServer%"=="ugfde33" (ECHO hallo2 >>C:\Temp\test.txt  
	) ELSE (
		IF "%EmpirumServer%"=="10.193.174.81" (ECHO hallo3 >>C:\Temp\test.txt  
	) ELSE (
		ECHO keinhallo >>c:\Temp\test.txt
	)
)

Kannst du mir nochmal weiterhelfen

Gruß
didie08
bastla
bastla 19.08.2008 um 16:52:33 Uhr
Goto Top
Hallo didie08!

Soferne es keine weiteren Aktionen gäbe, einfach:
IF /i "%EmpirumServer%"=="de301386" ECHO hallo1 >>C:\Temp\test.txt & goto :Ende  
IF /i "%EmpirumServer%"=="ugfde33" ECHO hallo2 >>C:\Temp\test.txt & goto :Ende  
...

:Ende
echo Hier geht es wieder fuer alle gleich weiter ...
Alternativ dazu eine Art Pendant zu einem VB-"Select Case" (als klassischer "Spaghetti-Code" face-wink):
IF /i "%EmpirumServer%"=="de301386" goto :Fall1  
IF /i "%EmpirumServer%"=="ugfde33" goto :Fall2  
...

::Case Else
echo keinhallo >>c:\Temp\test.txt
...
goto :Ende

:Fall1
ECHO hallo1 >>C:\Temp\test.txt
...
goto :Ende

:Fall2
ECHO hallo2 >>C:\Temp\test.txt
...
goto :Ende

...

:Ende
echo Hier geht es wieder fuer alle gleich weiter ...
Wenn Du genauer beschreibst, was Du vorhast, fällt mir vielleicht noch etwas anderes ein ...

Grüße
bastla
didie08
didie08 19.08.2008 um 19:30:56 Uhr
Goto Top
Hallo bastla

Es geht darum an veschiedenen PC's Freigaben als Laufwerke zu mappen, die sich auf verschiedenen Servern befinden. Der jeweilige Host Name oder die IP Adresse der Server ist als Systemvariable EmpirumServer=XXX an den PC's eingetragen.

Lautet die System Variable z.B. EmpirumServer=ugfde33 so wird mit "net use" die darauf befindliche Freigabe gemappt.

Ich hatte gedacht das mit aneinander gehängten if bzw. elseif Abfragen in einer batch Datei erledigen zu können.

Mit dem "Spaghetti-Code" lässt sich die Aufgabe gut lösen.

Nochmals Danke für deine Hilfe

Gruß
didie08
bastla
bastla 19.08.2008 um 19:51:02 Uhr
Goto Top
Hallo didie08!

Soferne es tatsächlich nur um das Mapping ginge, ließe sich das auch etwas kompakter lösen:
@echo off & setlocal
REM P: \\de301386\deShare1
REM S: \\de301386\deShare2
REM P: \\ugfde33\ugShare1
REM Q: \\ugfde33\ugShare2
REM S: \\ugfde33\ugShare3

for /f "tokens=2*" %%i in ('findstr /i "%EmpirumServer%" "%~f0"') do net use %%i "%%j" /p:no>nul  
Bei dieser Variante könntest Du die Liste der Zuordnungen relativ übersichtlich im Batch selbst hinterlegen und diese verwenden, indem Du einfach die Batchdatei (%~f0) nach allen Zeilen, welche den aktuellen Wert von %EmpirumServer% enthalten (dieser darf dann natürlich nur in den entsprechenden REM-Zeilen vorkommen), durchsuchen lässt und Dir aus diesen Zeilen (durch die Verwendung der Schleife können dies mehrere Zeilen und daher auch mehrere Mappings sein) die entsprechenden Informationen holst.

Grüße
bastla
didie08
didie08 20.08.2008 um 10:09:39 Uhr
Goto Top
Hallo bastla

Ich habe deinen Code auf meine Bedürfnissse Angepasst . Funktioniert prima

Nur Was mache ich wenn %EmpirumServer% nicht gesetzt ist oder einen Wert hat den ich nicht prüfe. Ich habe das mit dem IF NOT EXIST "v:\" gelöst.
Oder gibt es noch eine elegantere Lösung ?

@echo off & setlocal
REM de301386 v: \\ugfde11\X_level$
REM 10.193.174.81\ v: \\ugfde11\X_level$
REM ugf_hefe_02 v: \\ugf_hefe_03\X_level$
REM 10.193.164.8 v: \\ugf_hefe_03\X_level$
REM ugfde28 v: \\ugfde16\X_level$
REM 10.193.164.8 v: \\ugfde16\X_level$
rem for /f "tokens=3*" %%i in ('findstr /i "%EmpirumServer%" "%~f0"') do net use %%i "%%j" /p:no>nul  

IF NOT EXIST "v:\" net use v: \\ugfde11\Y_level  


Gruß
didie08
bastla
bastla 20.08.2008 um 11:14:02 Uhr
Goto Top
Hallo didie08!

Sauberer wäre folgende Vorgangsweise:
@echo off & setlocal
REM DATA de301386 v: \\ugfde11\X_level$
REM DATA 10.193.174.81\ v: \\ugfde11\X_level$
REM DATA ugf_hefe_02 v: \\ugf_hefe_03\X_level$
REM DATA 10.193.164.8 v: \\ugf_hefe_03\X_level$
REM DATA ugfde28 v: \\ugfde16\X_level$
REM DATA 10.193.164.8 v: \\ugfde16\X_level$

if not defined EmpirumServer goto :KeinServer
findstr "REM DATA" "%~f0"|findstr /i "%EmpirumServer%">nul || goto :NichtInListe  

for /f "tokens=4*" %%i in ('findstr "REM DATA" "%~f0"^|findstr /i "%EmpirumServer%"') do (  
    net use %%i /d>nul
    net use %%i "%%j" /p:no>nul  
)
goto :eof

:KeinServer
echo EmpirumServer nicht definiert
goto :Default

:NichtInListe
echo %EmpirumServer% scheint nicht in der Serverliste auf
goto :Default

:Default
echo Verbinde mit Default ...
net use v: /d
net use v: \\ugfde11\Y_level
Die "echo"-Zeilen können natürlich auch in eine Logdatei umgeleitet, etwa
echo %date%_%time%_%computername%_%username% EmpirumServer nicht definiert >>"\\ugfde11\Logs\MappingErrors.log  
oder ganz weggelassen werden (dann genügt auch ein Sprung direkt zu ":Default") ...

Grüße
bastla

[Edit] "findstr"-Zeilen korrigiert [/Edit]
didie08
didie08 20.08.2008 um 14:19:41 Uhr
Goto Top
Hallo bastla,

Funktioniert klasse

nochmals vielen Dank

Ich habe noch ein weiteres Problem, für das ich aber einen neuen Beitrag eröffne, damit das Ganze übersichtlich bleibt.


Gruß
didie08