Problem mit if defined bei Batch-Datei
Guten Tag...
Langsam wird es deprimierend. Datei ist fertig und funktionsfähig, da kommt mein Ausbilder an :"Und was wenn Laufwerksbuchstabe G: schon vergeben ist?" Kurz diskutiert ob es Sinn macht alles erst in C:\temp\ zu kopieren per Datei, tut es nicht, also für den Laufwerksbuchstaben eine Variable gesetzt die am Anfang erfragt wird. Soweit schön und gut, nun möchte ich diesen Laufwerksbuchstaben anschließen wieder löschen. Dies funktioniert bei 3 von 4 mal perfekt. Ich habe am Anfang der Datei eine Abfrage gemacht, ob alle updates, bestimmte updates, alle updates mit shutdown oder alle updates mit restart durchgeführt werden sollen. Das Problem liebt bei den bestimmten updates. Da sieht mein Code so aus:
Das Problem ist die "if defined name2 (" Funktion. Diese funktioniert nicht. Selbst wenn name2 keinen Wert hat springt er in die Klammer und möchte den ersten if-Befehl ausführen. Da aber kein Wert zum vergleichen existiert bricht die Datei mit der Begründung :"call ist an dieser Stelle syntakitsch nicht verarbeitbar" ab. Ich muss dort noch ein "net use %lw% /d" einsetzen, leider weiß ich nicht wo. Funktioniert es, wenn ich statt "if defined name 2(" das ganze umdrehe, nach dem Motto "if not defined name2 (net use %lw% /d) else echo %name2% if..."? Falls dies nicht funktionieren würde, könntet ihr mir sagen, wie es funktionieren würde?
MfG Noobstar0815
Langsam wird es deprimierend. Datei ist fertig und funktionsfähig, da kommt mein Ausbilder an :"Und was wenn Laufwerksbuchstabe G: schon vergeben ist?" Kurz diskutiert ob es Sinn macht alles erst in C:\temp\ zu kopieren per Datei, tut es nicht, also für den Laufwerksbuchstaben eine Variable gesetzt die am Anfang erfragt wird. Soweit schön und gut, nun möchte ich diesen Laufwerksbuchstaben anschließen wieder löschen. Dies funktioniert bei 3 von 4 mal perfekt. Ich habe am Anfang der Datei eine Abfrage gemacht, ob alle updates, bestimmte updates, alle updates mit shutdown oder alle updates mit restart durchgeführt werden sollen. Das Problem liebt bei den bestimmten updates. Da sieht mein Code so aus:
set name=0
set /p name="Bitte alle zu aktualisierenden Programme angeben (Bsp.: 134):"
set "num=-1"
:loop
set /a num=num+1
call set "name2=%%name:~%num%,1%%"
if defined name2 (
echo %name2%
if %name2%==1 call "%lw%\Update-Skripte\Java.bat"
if %name2%==2 call "%lw%\Update-Skripte\FlashX.bat"
if %name2%==3 call "%lw%\Update-Skripte\FlashPlug.bat"
if %name2%==4 call "%lw%\Update-Skripte\shockwave.bat"
if %name2%==5 call "%lw%\Update-Skripte\Firefox.bat"
if %name2%==6 call "%lw%\Update-Skripte\adobereader.bat"
if %name2%==7 call "%lw%\Update-Skripte\msdefender.bat"
if %name2%==8 shutdown -r -t 0
if %name2%==9 shutdown -c -t 0
goto :loop
)
MfG Noobstar0815
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 203269
Url: https://administrator.de/contentid/203269
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
31 Kommentare
Neuester Kommentar
Hallo @Noobstar0815,
ohne jetzt groß dein Problem angeschaut zu haben:
Die automatische Verwaltung von Laufwerksbuchstaben geht super mit
Gruß
Snow
ohne jetzt groß dein Problem angeschaut zu haben:
Die automatische Verwaltung von Laufwerksbuchstaben geht super mit
PUSHD
und POPD
. Wenn du PUSHD
mit einem Netzwerkpfad aufrufst, dann wird ein temporäres Laufwerkmapping gemacht, angefangen bei Z: und dein Arbeitsverzeichnis wird auch dort hin gesetzt. Sobald du dann POPD
aufrufst, landest du wieder in deinem vorherigen Ordner und das Mapping wird aufgehoben.Gruß
Snow
Die Variable habe ich ganz oben definiert,
> set /p lw="Bitte freien Laufwerksbuchstaben angeben (Bsp.: K:): "
> net use %lw% \\Www-hgr...
>
Hallo,
es wäre gut, wenn du deinen kompletten Code posten würdest, und nicht nur Teil davon
Ansonsten ist es m.E. recht schwierig dir zu helfen.
Andi
Hey. Was spricht dagegen, Zeilen 3 und 4 gegen zu ersetzen?
Dann kannst du dir das ganze %lw%-Gedöns ersparen. Da du eh nichts aus deinem aktuellen Verzeichnis ausführst ist es eh undurchdacht, jedesmal einen kompletten Pfad aufzurufen anstatt einfach einmal
Diese Version ist ohne %lw%. Alle
Gruß
Snow
PUSHD \\WWW-HGR\BDR\BDR-Benutzer\Ausbildung\automatischeUpdateswoechentlich
Dann kannst du dir das ganze %lw%-Gedöns ersparen. Da du eh nichts aus deinem aktuellen Verzeichnis ausführst ist es eh undurchdacht, jedesmal einen kompletten Pfad aufzurufen anstatt einfach einmal
cd /D K:
zu machen.cls
@echo off
PUSHD \\WWW-HGR\BDR\BDR-Benutzer\Ausbildung\automatischeUpdateswoechentlich
echo Updates
echo =======
echo.
echo [1] Alle Updates
echo [2] Einzelne Updates
echo [3] Alle Updates mit Herunterfahren
echo [4] Alle Updates mit Neustarten
set asw=0
set /p asw="Bitte Auswahl eingeben (Bsp.: 2): "
if %asw%==1 goto ALL
if %asw%==2 goto DIV
if %asw%==3 goto ALLSHUT
if %asw%==4 goto ALLRE
:DIV
echo.
echo [1] Java
echo [2] Flash Player Active X
echo [3] Flash Player Plug-In
echo [4] Shockwave
echo [5] Firefox
echo [6] Reader
echo [7] Microsoft Windows Defender
echo [8] Neustart (nur als letzte Ziffer!!!)
echo [9] Herunterfahren (nur als letzte Ziffer!!!)
echo.
set name=0
set /p name="Bitte alle zu aktualisierenden Programme angeben (Bsp.: 134):"
set "num=-1"
:loop
set /a num=num+1
call set "name2=%%name:~%num%,1%%"
echo "%name2%"
if "%name2%"=="" (POPD)
else (
if %name2%==1 call "Update-Skripte\Java.bat"
if %name2%==2 call "Update-Skripte\FlashX.bat"
if %name2%==3 call "Update-Skripte\FlashPlug.bat"
if %name2%==4 call "Update-Skripte\shockwave.bat"
if %name2%==5 call "Update-Skripte\Firefox.bat"
if %name2%==6 call "Update-Skripte\adobereader.bat"
if %name2%==7 call "Update-Skripte\msdefender.bat"
if %name2%==8 shutdown -r -t 0
if %name2%==9 shutdown -c -t 0
goto :loop
)
:ALL
echo Java
call "Update-Skripte\Java.bat"
echo Flash Player Active X
call "Update-Skripte\FlashX.bat"
echo Flash Player Plug-In
call "Update-Skripte\FlashPlug.bat"
echo Shockwave
call "Update-Skripte\shockwave.bat"
echo Firefox
call "Update-Skripte\Firefox.bat"
echo Adobe Reader
call "Update-Skripte\adobereader.bat"
echo Microsoft Windows Defender
call "Update-Skripte\msdefender.bat"
POPD
goto END
:ALLSHUT
echo Java
call "Update-Skripte\Java.bat"
echo Flash Player Active X
call "Update-Skripte\FlashX.bat"
echo Flash Player Plug-In
call "Update-Skripte\FlashPlug.bat"
echo Shockwave
call "Update-Skripte\shockwave.bat"
echo Firefox
call "Update-Skripte\Firefox.bat"
echo Adobe Reader
call "Update-Skripte\adobereader.bat"
echo Microsoft Windows Defender
call "Update-Skripte\msdefender.bat"
POPD
shutdown -c -t 0
:ALLRE
echo Java
call "Update-Skripte\Java.bat"
echo Flash Player Active X
call "Update-Skripte\FlashX.bat"
echo Flash Player Plug-In
call "Update-Skripte\FlashPlug.bat"
echo Shockwave
call "Update-Skripte\shockwave.bat"
echo Firefox
call "Update-Skripte\Firefox.bat"
echo Adobe Reader
call "Update-Skripte\adobereader.bat"
echo Microsoft Windows Defender
call "Update-Skripte\msdefender.bat"
POPD
shutdown -r -t 0
:END
echo Ende
Diese Version ist ohne %lw%. Alle
net use %lw% /D
wurden durch POPD ersetzt.Gruß
Snow
G: ist doch ein bereits vorhandenes Mapping? Du erstellst ja nur 1 Mapping dynamisch: Das auf K:. Sollte also keine Probleme mit G: geben.
Wo dein Fehler
Du darfst nicht schreiben sondern:
Liegt daran, dass Batch zeilenbasiert hinunterläuft und du somit im ersten beispiel den
Wo dein Fehler
else ist keine Anweisung
liegt:Du darfst nicht
if <abc> (command)
else (<command2>)
if <abc> (
<command>
) else (
<command 2>
)
Liegt daran, dass Batch zeilenbasiert hinunterläuft und du somit im ersten beispiel den
IF
-Block schon verlassen hast wenn du zum else
kommst.
Hallo Noobstar0815!
Übrigens: Wenn Du doch schon eine Mehrfachauswahl von Funktionen realisiert hast, würde ich die Wiederholungen in ":ALL", ":ALLSHUT" und ":ALLRE" einsparen und das (ungetestet) etwa so umsetzen (und mir außerdem einen aussagekräftigeren Variablennamen als "
Grüße
bastla
Diese Dateien werden durch die Batch aufgerufen, übernehmen sie dann auch die Paramter / Variablen?
Was haben denn Deine Tests dazu ergeben?Übrigens: Wenn Du doch schon eine Mehrfachauswahl von Funktionen realisiert hast, würde ich die Wiederholungen in ":ALL", ":ALLSHUT" und ":ALLRE" einsparen und das (ungetestet) etwa so umsetzen (und mir außerdem einen aussagekräftigeren Variablennamen als "
%name%
" einfallen lassen):cls
@echo off
PUSHD \\WWW-HGR\BDR\BDR-Benutzer\Ausbildung\automatischeUpdateswoechentlich
echo Updates
echo =======
echo.
echo [1] Alle Updates
echo [2] Einzelne Updates
echo [3] Alle Updates mit Herunterfahren
echo [4] Alle Updates mit Neustarten
set "asw="
set "name="
set /p asw="Bitte Auswahl eingeben (Bsp.: 2): "
if %asw%==1 (set "name=1234567" & goto :Ausf)
if %asw%==3 (set "name=12345678" & goto :Ausf)
if %asw%==4 (set "name=12345679" & goto :Ausf)
:DIV
echo.
echo [1] Java
echo [2] Flash Player Active X
echo [3] Flash Player Plug-In
echo [4] Shockwave
echo [5] Firefox
echo [6] Reader
echo [7] Microsoft Windows Defender
echo [8] Neustart (nur als letzte Ziffer!!!)
echo [9] Herunterfahren (nur als letzte Ziffer!!!)
echo.
set /p name="Bitte alle zu aktualisierenden Programme angeben (Bsp.: 134): "
:Ausf
set /a num=-1
:loop
set /a num+=1
call set "name2=%%name:~%num%,1%%"
echo "%name2%"
if "%name2%"=="" (
POPD
) else (
if %name2%==1 call "Update-Skripte\Java.bat"
if %name2%==2 call "Update-Skripte\FlashX.bat"
if %name2%==3 call "Update-Skripte\FlashPlug.bat"
if %name2%==4 call "Update-Skripte\shockwave.bat"
if %name2%==5 call "Update-Skripte\Firefox.bat"
if %name2%==6 call "Update-Skripte\adobereader.bat"
if %name2%==7 call "Update-Skripte\msdefender.bat"
if %name2%==8 shutdown -r -t 0
if %name2%==9 shutdown -c -t 0
goto :loop
)
:END
echo Ende
bastla
Hey @Noobstar0815,
Ich habe dir bereits geschildert warum du
Mit
Wenn du nicht auf hilfreiche Tipps aus bist: Selbst schuld.
Zu deiner IF-Abfrage: Sieht doch ganz klar aus?
Probiers mit
Kein Gruß
~ Snow
Ich habe dir bereits geschildert warum du
PUSHD
und POPD
verwenden sollst. aber hier nochmal:Mit
PUSHD
und POPD
kannst du dir das ganze net use
-Zeug sparen. Genauso wie das ständige merken des gemappten Laufwerks. Killt schonmal viele Fehlerquellen.Wenn du nicht auf hilfreiche Tipps aus bist: Selbst schuld.
Zu deiner IF-Abfrage: Sieht doch ganz klar aus?
if ==1 call ...
kann doch garnicht funktionieren. Immerhin ist %name2%
ja leer.Probiers mit
if x%name2%==x1
. Das erspart dir die Möglichkeit eines leeren String im Vergleich (welcher zu Syntax-Fehlern führt).Kein Gruß
~ Snow
Zitat von @Noobstar0815:
Mit dem PUSHD und POPD ist logisch, ja, allerdings machte es für mich zu dem Zeitpunkt keinen Sinn, da dies nicht
der Fehler war und nur unnötige Schreibarbeit bedeutet hätte. Es tut mir leid, falls ich sturr, naiv oder unfreundlich
rüberkomme, bin halt etwas eigen.
Mit dem PUSHD und POPD ist logisch, ja, allerdings machte es für mich zu dem Zeitpunkt keinen Sinn, da dies nicht
der Fehler war und nur unnötige Schreibarbeit bedeutet hätte. Es tut mir leid, falls ich sturr, naiv oder unfreundlich
rüberkomme, bin halt etwas eigen.
Mal ganz abgesehen davon, dass ich bereits eine komplett auf
PUSHD
und POPD
umgestellte Version gepostet habe.Aber egal.
Ändere aber bitte dein Update-Skript mit Batch-Datei ab! Walls of Text, keine ordentliche Formatierung und schlechtes Skripting haben in einer Anleitung nichts zu suchen. Nett wäre auch das verpacken von vielgenutzten Code-Teilen in Variablen (zumindest Laufwerkpfade wie
G:\Update-Skripte
).
Hallo Noobstar0815.
Die Meldung über die sysntaktische Nichtvereinbarkeit rührt daher, dass die Variable
Und da liegt der Hund begraben: Der Anweisungsblock nach dem
Damit die linke Seite nicht leer wird, ergänze die zu vergleichenden Werte mit irgendwas, z.B. (), , "", '', !!, xx, etc.
Mein Vorschlag:
Schöne Grüße
format-c
Die Meldung über die sysntaktische Nichtvereinbarkeit rührt daher, dass die Variable
%name2%
am Ende leer bzw. gelöscht ist und der Befehlsprozessor dann versucht die folgende Zeile zu parsen:if ==1 call "%lw%\Update-Skripte\Java.bat"
if
wird dann zwar nicht ausgeführt, aber trotzdem vom Parser gelesen und auf seine Richtigkeit hin überprüft. Die Syntax des Vergleichsoperators "==" erfordert genau zwei Argumente. In der obigen Zeile fehlt eines, ergo syntaktischer Fehler.Damit die linke Seite nicht leer wird, ergänze die zu vergleichenden Werte mit irgendwas, z.B. (), , "", '', !!, xx, etc.
Mein Vorschlag:
...
:loop
set /a num=num+1
call set "name2=%%name:~%num%,1%%"
REM bedingter Sprung zum EndOfFile
if '%name2%'=='' goto :eof
REM # falls dieses Skript selbst von einem anderen Skript
REM # aufgerufen wird, dann besser
REM if "%name2%"=="" goto ende1234
echo %name2%
if %name2%==1 call "%lw%\Update-Skripte\Java.bat"
if %name2%==2 call "%lw%\Update-Skripte\FlashX.bat"
if %name2%==3 call "%lw%\Update-Skripte\FlashPlug.bat"
if %name2%==4 call "%lw%\Update-Skripte\shockwave.bat"
if %name2%==5 call "%lw%\Update-Skripte\Firefox.bat"
if %name2%==6 call "%lw%\Update-Skripte\adobereader.bat"
if %name2%==7 call "%lw%\Update-Skripte\msdefender.bat"
if %name2%==8 shutdown -r -t 0
if %name2%==9 shutdown -c -t 0
goto :loop
:ende1234
...
Schöne Grüße
format-c