52634
22.09.2007, aktualisiert am 24.09.2007
5561
10
0
Wieso funktioniert das goto nicht?
Hallo...
Ich habe eine batch in der überprüft wird ob ein Rechner existiert, die Abfrage funktioniert aber das springen zur benötigten Funktion wird ignoriert und alles abgearbeitet... Hoffe ihr könntt mir helfen^^.
Hier die Batch:
[Edit Biber 24.9.] Skript als formatiert. [/Edit]
Ich habe eine batch in der überprüft wird ob ein Rechner existiert, die Abfrage funktioniert aber das springen zur benötigten Funktion wird ignoriert und alles abgearbeitet... Hoffe ihr könntt mir helfen^^.
Hier die Batch:
@echo OFF
echo Ueberpruefen ob Netzrechner vorhanden sind!
ping 192.168.2.33 -n 1 >> "%tmp%\nlw1.txt"
ping 192.168.2.30 -n 1 >> "%tmp%\nlw2.txt"
ping 192.168.2.34 -n 1 >> "%tmp%\nlw3.txt"
goto :nlw1suchen:
:nlw1suchen:
find /I "Antwort von 192.168.2.33" "%tmp%\nlw1.txt"
IF %ERRORLEVEL% == 1 goto :nlw1:
IF %ERRORLEVEL% == 0 goto :nlw2suchen:
:nlw1:
echo Netzlaufwerke-Server werden hinzugefuegt.
net use z: \\192.168.2.33\A /user:geheim_;-) geheim_;-) /PERSISTENT:NO
net use y: \\192.168.2.33\E /user:geheim_;-) geheim_;-) /PERSISTENT:NO
net use x: \\192.168.2.33\C$ /user:geheim_;-) geheim_;-) /PERSISTENT:NO
del "%tmp%nlw1.txt"
goto :nlw2suchen:
:nlw2suchen:
find /I "Antwort von 192.168.2.30" "%tmp%\nlw2.txt"
IF %ERRORLEVEL% == 1 goto :nlw2:
IF %ERRORLEVEL% == 0 goto :nlw3suchen:
:nlw2:
echo Netzlaufwerke-Dad werden hinzugefuegt.
net use i: \\192.168.2.30\C$ /user:geheim_;-) geheim_;-) /PERSISTENT:NO
net use m: \\192.168.2.30\D$ /user:geheim_;-) geheim_;-) /PERSISTENT:NO
del "%tmp%\nlw2.txt"
goto :nlw3suchen:
:nlw3suchen:
find /I "Antwort von 192.168.2.34" "%tmp%\nlw3.txt"
IF %ERRORLEVEL% == 1 goto :nlw3:
IF %ERRORLEVEL% == 0 goto :nwdsuchen:
:nlw3:
echo Netzlaufwerke-Desktop werden hinzugefuegt.
net use n: \\192.168.2.34\C$ /user:geheim_;-) geheim_;-) /PERSISTENT:NO
net use o: \\192.168.2.34\A$ /user:geheim_;-) geheim_;-) /PERSISTENT:NO
net use p: \\192.168.2.34\F$ /user:geheim_;-) geheim_;-) /PERSISTENT:NO
del "%tmp%\nlw3.txt"
goto :nwdsuchen:
:nwdsuchen:
echo Netzwerkdrucker werden hinzugefuegt.
reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices" >> "%tmp%\nwd.txt"
find /I "\\192.168.2.33\HP-Drucker" "%tmp%\nwd.txt"
IF %ERRORLEVEL% == 1 rundll32 printui.dll,PrintUIEntry /in /n "\\192.168.2.33\HP-Drucker" goto :nwd:
:nwd:
rundll32 printui.dll,PrintUIEntry /y /n "\\192.168.2.33\HP-Drucker"
del "%tmp%\nwd.txt"
echo MySQL wird gestoppt!
net stop mysql
PAUSE
[Edit Biber 24.9.] Skript als formatiert. [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 69283
Url: https://administrator.de/contentid/69283
Ausgedruckt am: 23.11.2024 um 05:11 Uhr
10 Kommentare
Neuester Kommentar
@screen2
Bei goto können beide Doppelpunkte weg (oder jeder einzelne der beiden) und bei der Sprungmarke muss einer am Anfang stehen (am Ende können so viele, wie in eine Batchzeile eben reinpassen, inkl etwa einem Kommentar, folgen).
Beispiel:
Die Zeile "echo Kein Sprung"! ist nur zu Demo-Zwecken gedacht, da sie ohnehin nie errreicht wird (bei nicht gefundenem Sprungziel verursacht bereits die "goto"-Zeile einen Fehler).
@TuXHunt3R
Hinsichtlich der Sonderzeichen ist sicherlich etwas Vorsicht geboten, da ja im Batch zB "!%&/?+ jeweils eine eigene Bedeutung haben (können), aber, wie das Beispiel oben zeigen soll: grundsätzlich verboten sind Sonderzeichen hier nicht.
Grüße
bastla
Bei goto müssen beide Doppelpunkte weg und bei der Sprungmarke dürfen sie nur am Anfang stehen.
kann man so nicht stehen lassen - ich würde das eher so formulieren:Bei goto können beide Doppelpunkte weg (oder jeder einzelne der beiden) und bei der Sprungmarke muss einer am Anfang stehen (am Ende können so viele, wie in eine Batchzeile eben reinpassen, inkl etwa einem Kommentar, folgen).
Beispiel:
@echo off
goto :($)1Label@§Test-0816:
echo Kein Sprung!
pause
goto :eof
:($)1Label@§Test-0816{{comment_single_line_remark:0}}
echo Angekommen ...
pause
@TuXHunt3R
Hinsichtlich der Sonderzeichen ist sicherlich etwas Vorsicht geboten, da ja im Batch zB "!%&/?+ jeweils eine eigene Bedeutung haben (können), aber, wie das Beispiel oben zeigen soll: grundsätzlich verboten sind Sonderzeichen hier nicht.
Grüße
bastla
Hallo MGrote!
Das Problem rührt daher, dass "find" einen Errorlevel 1 dann liefert, wenn der gesuchte Text nicht gefunden wurde, daher also
Kürzer:
Noch kürzer (soferne der Batch unter XP läuft - W2000 hat mit dem "ping"-Errorlevel Probleme):
"goto :eof" bedeutet: "Batch beenden" oder, bei Verwendung in einem ge"call"ten Block: "Unterprogramm beenden - Rücksprung"
Grüße
bastla
[Edit] ">nul" zu den "ping"-Zeilen hinzugefügt - soll, so wie bei den "find"-Zeilen - die Optik etwas verbessern. [/Edit]
Das Problem rührt daher, dass "find" einen Errorlevel 1 dann liefert, wenn der gesuchte Text nicht gefunden wurde, daher also
find /I "Antwort von 192.168.2.33" "%tmp%\nlw1.txt">nul
if errorlevel 1 goto :nlw2suchen:
echo Netzlaufwerke-Server werden hinzugefuegt.
find /I "Antwort von 192.168.2.33" "%tmp%\nlw1.txt">nul||goto :nlw2suchen:
echo Netzlaufwerke-Server werden hinzugefuegt.
ping 192.168.2.33 -n 1 >nul||goto :nlw2suchen:
echo Netzlaufwerke-Server werden hinzugefuegt.
ping 192.168.2.33 -n 1 >nul&&(
echo Netzlaufwerke-Server werden hinzugefuegt.
net use z: \\192.168.2.33\A /user:geheim geheim /PERSISTENT:NO
)
Grüße
bastla
[Edit] ">nul" zu den "ping"-Zeilen hinzugefügt - soll, so wie bei den "find"-Zeilen - die Optik etwas verbessern. [/Edit]
Moin MGrote,
auch wenn der Beitrag schon als gelöst markiert ist, möchte ich noch anmerken:
[Das soll jetzt kein korrigierter, getesteter Batch sein, sondern nur die Ur-Version mit formalen Anmerkungen.]
Grüße
Biber
auch wenn der Beitrag schon als gelöst markiert ist, möchte ich noch anmerken:
@echo OFF
echo Ueberpruefen ob Netzrechner vorhanden sind!
ping 192.168.2.33 -n 1 >> "%tmp%\nlw1.txt"
ping 192.168.2.30 -n 1 >> "%tmp%\nlw2.txt"
ping 192.168.2.34 -n 1 >> "%tmp%\nlw3.txt"
::###########----> Na toll, hier wird immer an evtl. bestehende nlwX.txt angefügt.
::###########---> Schau doch mal weiter unten, ob in JEDEM Fall auch die nlwX'e gelöscht werden....;-)
goto :nlw1suchen:
:nlw1suchen:
find /I "Antwort von 192.168.2.33" "%tmp%\nlw1.txt"
IF %ERRORLEVEL% == 1 goto :nlw1:
<b>IF %ERRORLEVEL% == 0 goto :nlw2suchen:</b>
::########### unabhängig von der Logik (s. bastlas Hinweis):
::########### das "IF %ERRORLEVEL% == 0 " ist ohne Sinnverlust entfernbar. Das "goto ..." reicht.
:nlw1:
echo Netzlaufwerke-Server werden hinzugefuegt.
net use z: \\192.168.2.33\A /user:geheim_;-) geheim_;-) /PERSISTENT:NO
::######### a) Wenn doch gefühlte 27x auf "\\192.168.2.33" gemapt wird, dann sollte es in eine %variable%
::######### b) wenn doch gefühlte 27x das (ohnehin defaultwertige) "net use .../Persistent:No" dahintersteht,
::######### dann wäre EINE Zeile "Net use /p:no" VOR dem Actionteil pflegeleichter.
net use y: \\192.168.2.33\E /user:geheim_;-) geheim_;-) /PERSISTENT:NO
net use x: \\192.168.2.33\C$ /user:geheim_;-) geheim_;-) /PERSISTENT:NO
del "%tmp%nlw1.txt"
goto :nlw2suchen:
:nlw2suchen:
....
:nlw2:
....
:nlw3suchen:
...
:nlw3:
....
:nwdsuchen:
echo Netzwerkdrucker werden hinzugefuegt.
reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices" >> "%tmp%\nwd.txt"
find /I "\\192.168.2.33\HP-Drucker" "%tmp%\nwd.txt"
IF %ERRORLEVEL% == 1 rundll32 printui.dll,PrintUIEntry /in /n "\\192.168.2.33\HP-Drucker" goto :nwd:
::########## Um noch mal auf die Kernfrage zurückzukommen: Auch dieses GOTO kann nicht funktionieren:
::########## denn nach "RunDLL23 printUI.DLL ..... HP-Drucker" fehlt mindestens ein, beseer zwei "&"
::########## IF %ERRORLEVEL% == 1 rundll32 printui.dll,PrintUIEntry .......\HP-Drucker" && goto :nwd:
::########## Andererseits.... er müsste ja nicht weit goto'en..... er merkt zwar einen Parameterfehler....
::########## "'Goto :nwd:' kann ich nich' interpretieren", aber geht natürlich in die Folgezeile.
:nwd:
rundll32 printui.dll,PrintUIEntry /y /n "\\192.168.2.33\HP-Drucker"
del "%tmp%\nwd.txt"
echo MySQL wird gestoppt!
net stop mysql
PAUSE
Grüße
Biber