noobstar0815
Goto Top

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:
 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 
)
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

Content-ID: 203269

Url: https://administrator.de/contentid/203269

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

Noobstar0815
Noobstar0815 13.03.2013 um 13:45:04 Uhr
Goto Top
Ok also bei
set "num=-1"   
:loop 
set /a num=num+1 

call set "name2=%%name:~%num%,1%%"   
if %name2%== (net use %lw% /d) else(  
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 
)
aktzeptiert er zum 1. mal mein else, allerdings weigert er sich "net use %lw% /d" anzuwenden, weil use syntaktisch nicht verarbeitbar ist. Hat jemand eine Erklärung?
MfG Noobstar0815
SlainteMhath
SlainteMhath 13.03.2013 um 14:09:36 Uhr
Goto Top
versuchs mal mit
if "%name2%"=="" ...  
Noobstar0815
Noobstar0815 13.03.2013 um 14:16:44 Uhr
Goto Top
So habe ich es mitlerweile schon, allerdings weigert er sich weiterhin "net use %lw% /d" auszuführen da net syntaktisch nicht verarbeitbar ist
andimue
andimue 13.03.2013 um 14:41:50 Uhr
Goto Top
Hi Noobstar0815,

ich seh in deiner Prozedur nicht, wo du die Variable lw definierst. Wenn die %lw% natürlich leer ist wäre die Fehlermeldung erklärlich

Gruß
Andi
Noobstar0815
Noobstar0815 13.03.2013 um 14:43:21 Uhr
Goto Top
Ich versuche grade mit einer 2. Datei den Fehler zu finden.
 if %a%=="" (net use P: /d) else (echo eingabe vorhanden)   
diesmal gibt es keine Fehler Meldung und else wird ausgeführt, leider auch wenn ich keine Eingabe mache
SlainteMhath
SlainteMhath 13.03.2013 um 14:52:17 Uhr
Goto Top
if "%a%"=="" ....  
Noobstar0815
Noobstar0815 13.03.2013 um 14:58:58 Uhr
Goto Top
I dont know why, aber
set "num=-1"   
:loop 
set /a num=num+1 

call set "name2=%%name:~%num%,1%%"   
echo "%name2%"  
if "%name2%"=="" (net use %lw% /d)   
else (  
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 
)
läuft, bricht aber durch Fehlermeldungen ab, was aber auch Ok ist, weil er dies erst tut, nachdem alle if-Befehle ausgeführt wurden wie ich es wollte und nachdem %lw% gelöscht wurde.
Noobstar0815
Noobstar0815 13.03.2013 um 15:00:21 Uhr
Goto Top
Zitat von @andimue:
Hi Noobstar0815,

ich seh in deiner Prozedur nicht, wo du die Variable lw definierst. Wenn die %lw% natürlich leer ist wäre die
Fehlermeldung erklärlich

Gruß
Andi

Die Variable habe ich ganz oben definiert,
set /p lw="Bitte freien Laufwerksbuchstaben angeben (Bsp.: K:): "  
net use %lw% \\Www-hgr...
SlainteMhath
SlainteMhath 13.03.2013 um 15:00:48 Uhr
Goto Top
Gut, dann warten wir hier jetzt auf die nächste Frage von deinem Ausbilder ^^
Snowman25
Snowman25 13.03.2013 um 15:21:40 Uhr
Goto Top
Hallo @Noobstar0815,

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
andimue
andimue 14.03.2013 um 09:48:12 Uhr
Goto Top
Zitat von @Noobstar0815:

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 face-sad
Ansonsten ist es m.E. recht schwierig dir zu helfen.

Andi
Noobstar0815
Noobstar0815 14.03.2013 aktualisiert um 10:41:02 Uhr
Goto Top
Also langsam hab ich wirklich die Schnauze voll, gestern lief alles, heute nicht.
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%"=="" (net use %lw% /d)   
else (  
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 
)
Ich habe nichts dran verändet... Er meckert dass else falsch geschrieben oder unbekannt ist.
Achso und noch eine Frage, ich rufe ja anderen .bat-Dateien auf. Diese greifen ebenfalls auf das Laufwerk zu, funktioniert dann dort %lw% auch oder muss ich mir da etwas anderes einfallen lassen?
Noobstar0815
Noobstar0815 14.03.2013 um 10:42:11 Uhr
Goto Top
Ok hier der ganze code
cls
@echo off
set /p lw="Bitte freien Laufwerksbuchstaben angeben (Bsp.: K:): "  
net use %lw% \\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%"=="" (net use %lw% /d)   
else (  
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 
)

:ALL
echo Java
call "%lw%\Update-Skripte\Java.bat"  
echo Flash Player Active X
call "%lw%\Update-Skripte\FlashX.bat"  
echo Flash Player Plug-In
call "%lw%\Update-Skripte\FlashPlug.bat"  
echo Shockwave
call "%lw%\Update-Skripte\shockwave.bat"  
echo Firefox
call "%lw%\Update-Skripte\Firefox.bat"  
echo Adobe Reader
call "%lw%\Update-Skripte\adobereader.bat"  
echo Microsoft Windows Defender
call "%lw%\Update-Skripte\msdefender.bat"  
net use %lw% /d
goto END

:ALLSHUT
echo Java
call "%lw%\Update-Skripte\Java.bat"  
echo Flash Player Active X
call "%lw%\Update-Skripte\FlashX.bat"  
echo Flash Player Plug-In
call "%lw%\Update-Skripte\FlashPlug.bat"  
echo Shockwave
call "%lw%\Update-Skripte\shockwave.bat"  
echo Firefox
call "%lw%\Update-Skripte\Firefox.bat"  
echo Adobe Reader
call "%lw%\Update-Skripte\adobereader.bat"  
echo Microsoft Windows Defender
call "%lw%\Update-Skripte\msdefender.bat"  
net use %lw% /d
shutdown -c -t 0

:ALLRE
echo Java
call "%lw%\Update-Skripte\Java.bat"  
echo Flash Player Active X
call "%lw%\Update-Skripte\FlashX.bat"  
echo Flash Player Plug-In
call "%lw%\Update-Skripte\FlashPlug.bat"  
echo Shockwave
call "%lw%\Update-Skripte\shockwave.bat"  
echo Firefox
call "%lw%\Update-Skripte\Firefox.bat"  
echo Adobe Reader
call "%lw%\Update-Skripte\adobereader.bat"  
echo Microsoft Windows Defender
call "%lw%\Update-Skripte\msdefender.bat"  
net use %lw% /d
shutdown -r -t 0
:END
echo Ende
Noobstar0815
Noobstar0815 14.03.2013 um 10:52:46 Uhr
Goto Top
Und hier einmal die Ausgabe der cmd. Es scheint doch alles zu funktionieren, allerdings sind mir da ein paar Fehlermeldungen zu viel, vor allem am Schluss, könnt ihr mir sagen wie ich die los werden?
G:\Update-Skripte>set /p lw="Bitte freien Laufwerksbuchstaben angeben (Bsp.: K:)  
: "  
Bitte freien Laufwerksbuchstaben angeben (Bsp.: K:): K:

G:\Update-Skripte>net use K: \\WWW-HGR\BDR\BDR-Benutzer\Ausbildung\automatischeU
pdateswoechentlich
Der Befehl wurde erfolgreich ausgeführt.


G:\Update-Skripte>echo          Updates
        Updates

G:\Update-Skripte>echo          =======
        =======

G:\Update-Skripte>echo.


G:\Update-Skripte>echo  [1] Alle Updates
[1] Alle Updates

G:\Update-Skripte>echo  [2] Einzelne Updates
[2] Einzelne Updates

G:\Update-Skripte>echo  [3] Alle Updates mit Herunterfahren
[3] Alle Updates mit Herunterfahren

G:\Update-Skripte>echo  [4] Alle Updates mit Neustarten
[4] Alle Updates mit Neustarten

G:\Update-Skripte>set asw=0

G:\Update-Skripte>set /p asw="Bitte Auswahl eingeben (Bsp.: 2): "  
Bitte Auswahl eingeben (Bsp.: 2): 2

G:\Update-Skripte>if 2 == 1 goto ALL

G:\Update-Skripte>if 2 == 2 goto DIV

G:\Update-Skripte>echo.


G:\Update-Skripte>echo  [1] Java
[1] Java

G:\Update-Skripte>echo  [2] Flash Player Active X
[2] Flash Player Active X

G:\Update-Skripte>echo  [3] Flash Player Plug-In
[3] Flash Player Plug-In

G:\Update-Skripte>echo  [4] Shockwave
[4] Shockwave

G:\Update-Skripte>echo  [5] Firefox
[5] Firefox

G:\Update-Skripte>echo  [6] Reader
[6] Reader

G:\Update-Skripte>echo  [7] Microsoft Windows Defender
[7] Microsoft Windows Defender

G:\Update-Skripte>echo  [8] Neustart (nur als letzte Ziffer!!!)
[8] Neustart (nur als letzte Ziffer!!!)

G:\Update-Skripte>echo  [9] Herunterfahren (nur als letzte Ziffer!!!)
[9] Herunterfahren (nur als letzte Ziffer!!!)

G:\Update-Skripte>echo.


G:\Update-Skripte>set name=0

G:\Update-Skripte>set /p name="Bitte alle zu aktualisierenden Programme angeben  
(Bsp.: 134):"  
Bitte alle zu aktualisierenden Programme angeben (Bsp.: 134):2

G:\Update-Skripte>set "num=-1"  

G:\Update-Skripte>set /a num=num+1

G:\Update-Skripte>call set "name2=%name:~0,1%"  

G:\Update-Skripte>echo "2"  
"2"  

G:\Update-Skripte>if "2" == "" (net use K: /d )  

G:\Update-Skripte>else (
Der Befehl "else" ist entweder falsch geschrieben oder  
konnte nicht gefunden werden.

G:\Update-Skripte>if 2 == 1 call "K:\Update-Skripte\Java.bat"  

G:\Update-Skripte>if 2 == 2 call "K:\Update-Skripte\FlashX.bat"  

G:\Update-Skripte>start /wait "" "G:\Adobe Flash Player Active X\install_flash_p  
layer_11_active_x.msi" /qn  

G:\Update-Skripte>echo Flash Player Active X fertig
Flash Player Active X fertig

G:\Update-Skripte>if 2 == 3 call "K:\Update-Skripte\FlashPlug.bat"  

G:\Update-Skripte>if 2 == 4 call "K:\Update-Skripte\shockwave.bat"  

G:\Update-Skripte>if 2 == 5 call "K:\Update-Skripte\Firefox.bat"  

G:\Update-Skripte>if 2 == 6 call "K:\Update-Skripte\adobereader.bat"  

G:\Update-Skripte>if 2 == 7 call "K:\Update-Skripte\msdefender.bat"  

G:\Update-Skripte>if 2 == 8 shutdown -r -t 0

G:\Update-Skripte>if 2 == 9 shutdown -c -t 0

G:\Update-Skripte>goto :loop

G:\Update-Skripte>set /a num=num+1

G:\Update-Skripte>call set "name2=%name:~1,1%"  

G:\Update-Skripte>echo ""  
""  

G:\Update-Skripte>if "" == "" (net use K: /d )  
K: wurde erfolgreich gelöscht.


G:\Update-Skripte>else (
Der Befehl "else" ist entweder falsch geschrieben oder  
konnte nicht gefunden werden.
"call" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

G:\Update-Skripte>if ==1 call "K:\Update-Skripte\Java.bat"  

G:\Update-Skripte>
Snowman25
Snowman25 14.03.2013 um 10:57:23 Uhr
Goto Top
Hey. Was spricht dagegen, Zeilen 3 und 4 gegen
PUSHD \\WWW-HGR\BDR\BDR-Benutzer\Ausbildung\automatischeUpdateswoechentlich
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 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
Noobstar0815
Noobstar0815 14.03.2013 um 11:01:28 Uhr
Goto Top
Danke Snow, das klingt nicht schlecht, nur weiß ich dann nicht, wie ich das mit den anderen Dateien machen muss. Die ganzen call-Befehle rufen Dateien wie diese:
 @for %%f in ("G:\Firefox\*.*") do start /wait "" "%%f" /qn  
echo Firefox fertig
auf. Wie müsste ich es dann dort mit dem Pfad machen? Weil ich weiß ja nicht, welchen Laufwerksbuchstaben PUSHD setzt. Du sagtest ja er fängt bei Z: an, das wiederum heißt dass wenn Z: vergeben ist er sich einen anderen nimmt.
Snowman25
Snowman25 14.03.2013 um 11:10:06 Uhr
Goto Top
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 else ist keine Anweisung liegt:
Du darfst nicht
 if <abc> (command)
else (<command2>)
schreiben sondern:
 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.
Noobstar0815
Noobstar0815 14.03.2013 um 11:36:18 Uhr
Goto Top
Danke Snow für die Erklärung. Das Problem ist, dass meine Dateien mit G: veraltet sind. Als ich sie geschrieben habe, hatte ich auch bei der Hauptdatei nicht net use %lw% sondern net use G:, da ich dies nun variabel gemacht habe, muss ich nun auch die anderen ändern. Nur wie mache ich es? Diese Dateien werden durch die Batch aufgerufen, übernehmen sie dann auch die Paramter / Variablen?
bastla
bastla 14.03.2013 um 14:32:51 Uhr
Goto Top
Hallo Noobstar0815!

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
Grüße
bastla
Noobstar0815
Noobstar0815 15.03.2013 um 08:46:11 Uhr
Goto Top
Das ist eine gute Idee Bastla, danke, aber ich werde es jetzt so lassen. Die Fehlermeldungen die mich gestört hatten, lagen an einer falschen Syntax mit if else ... Jetzt kommt nur noch eine Fehlermeldung, dass call syntaktisch nicht verarbeitbar ist. Dies ist aber auch gut, da es so das Programm nach meiner Auswahl und nach überprüfen der if-Abfragen beendet, sobald name2 keinen Wert mehr hat.
bastla
bastla 15.03.2013 um 13:13:55 Uhr
Goto Top
Hallo Noobstar0815!
Jetzt kommt nur noch eine Fehlermeldung, dass call syntaktisch nicht verarbeitbar ist. Dies ist aber auch gut, da es so das Programm nach meiner Auswahl und nach überprüfen der if-Abfragen beendet, sobald name2 keinen Wert mehr hat.
That hurts ...

Grüße
bastla
Biber
Biber 15.03.2013 um 14:12:53 Uhr
Goto Top
Hmmja, Noobstar0815,

wenn also eine bestimmte Fehlermeldung auftritt, dann weiss der Skriptschreiber, dass alles works as designed???

Es sind schon Entwickler aus geringeren Anlässen zum Leergutsammler umgeschult worden.

Ich geb dir auch mal ein dislike mit ins Wochenende.

Grüße
Biber
Noobstar0815
Noobstar0815 15.03.2013 um 15:44:26 Uhr
Goto Top
Moin Biber, du hast recht. Allerdings wäre es eigentlich in diesem Fall kein Problem, da es ein gewollter Fehler ist, der das Programm beendet. Was allerdings nicht sein sollte, ist, dass es immer noch nicht läuft :D Ich habe gestern die Syntax der if-else-Funktion korrigiert, anschließend getestet. Beim Test habe ich nicht richtig aufgepasst, sondern nur geschaut, ob er noch Fehlermeldungen wegen if-else gibt, was nicht der Fall ist. Allerdings löscht er meint net use nicht mehr.
G:\Update-Skripte>set name=0

G:\Update-Skripte>set /p name="Bitte alle zu aktualisierenden Programme angeben  
(Bsp.: 134):"  
Bitte alle zu aktualisierenden Programme angeben (Bsp.: 134):2

G:\Update-Skripte>set "num=-1"  

G:\Update-Skripte>set /a num=num+1

G:\Update-Skripte>call set "name2=%name:~0,1%"  

G:\Update-Skripte>echo "2"  
"2"  

G:\Update-Skripte>if "2" == "" (net use K: /d )  else (  
if 2 == 1 call "K:\Update-Skripte\Java.bat"  
 if 2 == 2 call "K:\Update-Skripte\FlashX.bat"  
 if 2 == 3 call "K:\Update-Skripte\FlashPlug.bat"  
 if 2 == 4 call "K:\Update-Skripte\shockwave.bat"  
 if 2 == 5 call "K:\Update-Skripte\Firefox.bat"  
 if 2 == 6 call "K:\Update-Skripte\adobereader.bat"  
 if 2 == 7 call "K:\Update-Skripte\msdefender.bat"  
 if 2 == 8 shutdown -r -t 0
 if 2 == 9 shutdown -c -t 0
 goto :loop
)

G:\Update-Skripte>start /wait "" "K:\Adobe Flash Player Active X\install_flash_p  
layer_11_active_x.msi" /qn  

G:\Update-Skripte>echo Flash Player Active X fertig
Flash Player Active X fertig

G:\Update-Skripte>set /a num=num+1

G:\Update-Skripte>call set "name2=%name:~1,1%"  

G:\Update-Skripte>echo ""  
""  
"call" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

G:\Update-Skripte>if ==1 call "K:\Update-Skripte\Java.bat"  
Er ignoriert nach dem :LOOP die if-Abfrage komplett und springt direkt in den else-Teil, weiß jemand warum? Kann es sein, dass die geschieht weil die if-Abfrage am Anfang nicht zu traf dass er sie deswegen auslässt?
Snowman25
Snowman25 15.03.2013 um 16:08:13 Uhr
Goto Top
Welches net use? Du hast keine net use mehr, da du doch PUSHD und POPD verwendest.
Und die call set-Anweisung kommt aus einem anderen Skript.
Endoro
Endoro 16.03.2013, aktualisiert am 18.03.2013 um 01:23:20 Uhr
Goto Top
Hallo,

die IfAbfrage wird nicht ignoriert. Wenn du meinst, dass der ElseZweig abgearbeitet wird: schreib doch da mal ein `Echo` an den Anfang!

bb
Noobstar0815
Noobstar0815 20.03.2013 um 08:54:44 Uhr
Goto Top
Also, um weitere Verwirrungen zu vermeiden: Ich benutze weiterhin "net use", da mir nicht klar ist, warum ich es unbedingt in "PUSHD" und "POPD" ändern sollte. Desweiteren habe ich Echo am Anfang stehen, was man bei dem gesamt Code sehen kann. Allerdings habe ich kein Verständnis dafür, jedes mal 115 Zeilen zu posten, obwohl sich meistens nichts ändert. Ich habe einmal den gesamten Code gepostet, und poste dann nur noch die Änderungen. Bei der IfAbfrage ist folgendes: Er ignoriert den If-Teil komplett und arbeitet sturr den Else-Teil runter.
Snowman25
Snowman25 20.03.2013 um 10:22:59 Uhr
Goto Top
Hey @Noobstar0815,

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
Noobstar0815
Noobstar0815 20.03.2013 um 14:02:58 Uhr
Goto Top
OK Snow,
Also, das mit dem PUSHD und POPD benutze ich nicht, da ich bereits alles eingegeben hatte, und es so unnöitge Arbeit gewesen wäre, wenn ich alles geändert hätte. Zudem lag der Fehler nicht bei dem %lw%. Desweiteren war es beabsichtigt, dass %name2% irgendwann leer ist. %name2% wird mit der "num"sten Ziffer von "name" gesetzt, ist der Wert von "num" höher als die Länger der Ziffern von "name" sollte "name2" leer sein. Deshalb wollte ich es mit einer if-else-Abfrage machen, "if %name2%=="" net use %lw% /d". Dies wollte CMD aber nicht und hat den if-Befehl ignoriert und sprang direkt zum else-Befehl. Daraufhin habe ich es etwas geändert, nun sieht es so aus
 set "num=-1"   
:loop 
set /a num=num+1 

call set "name2=%%name:~%num%,1%%"   
echo "%name2%"    
if "%name2%"=="" goto END  
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 
)
goto END
Das %name2% musste ich dort auch noch in "" setzen, damit %name2%, sollte "num" höher sein als die Länge der Ziffern von "name", den Wert "" hat und erkannt werden kann. So gibt es keine einzige Fehlermeldung in dieser Datei mehr und alles läuft wie geplant.

Ich weiß ich könnte mehr auf Tipps eingehen, ich gehe allerdings nur auf Tipps ein, die mir in dem Moment logisch erscheinen. 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.
Da nun alles läuft bedanke ich mich noch einmal bei euch allen für die Hilfe und markiere die Frage als beantwortet.
Snowman25
Snowman25 20.03.2013 um 14:20:58 Uhr
Goto Top
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.

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).
format-c
format-c 24.03.2013, aktualisiert am 25.03.2013 um 00:12:45 Uhr
Goto Top
Hallo Noobstar0815.

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"
Und da liegt der Hund begraben: Der Anweisungsblock nach dem 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
Noobstar0815
Noobstar0815 08.04.2013 um 14:44:16 Uhr
Goto Top
Danke format-c, allerdings bin ich 4 Tage vorher selbst schon auf die Lösung gestoßen dank der Hilfe vorheriger Posts.