evinben
Goto Top

Pech mit GOTO-Befehl, wenn die Sprungmarke in der Batch-Datei nicht gefunden werden kann.

Hallo!

Diesmal habe ich ein seltsames Problem:

Eine Batch-Datei wird auf unterschiedlichen PCs ausgeführt. In der Batch-Datei steht:
goto :%COMPUTERNAME%

:PC1
call ….

:PC2
call ….

:PC3
call ….

pause
goto :eof


:M5
:Meldung ausgeben
echo Dieser Computer ist noch nicht in der Datenbank. 


Wenn der Name des jeweiligen PCs in der Batch-Datei noch nicht als Sprungmarke eingetragen worden ist, dann bricht goto :%COMPUTERNAME% den ganzen Batch ab.
Nun ist die Frage: Wie kann ich eine IF-Abfrage oder ähnliches einbauen, die dann bei einem Fehler auf die Sprungmarke :M5 umleitet.


Danke schön.

evinben

Content-Key: 184673

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

Printed on: April 24, 2024 at 09:04 o'clock

Member: Hitman4021
Hitman4021 May 08, 2012 at 16:54:47 (UTC)
Goto Top
Hallo,

Goto beendet bei fehlenden Sprungmarken immer.

Du könntest nur vor dem goto eine IF-Abgrage einbauen.
Irgendwie so:
if %computername% == PC1 | %computername& == PC2 | usw...
(
goto %computername%
)
else
(
goto M5
)
Habe schon lange nichts mehr in Batch gemacht aber so ca dürfte das hinkommen

Gruß
Member: bastla
bastla May 08, 2012 at 17:16:10 (UTC)
Goto Top
Hallo evinben!

Etwa so:
findstr /b ":%computername%" "%~f0">nul||goto :M5
- setzt voraus, dass Deine Sprungmarken jeweils am Zeilenanfang stehen - ansonsten "/b" weglassen (ist aber natürlich weniger sicher) ...

Grüße
bastla
Member: evinben
evinben May 08, 2012 at 19:28:55 (UTC)
Goto Top
Hallo Hitman4021,

danke dir für deinen Vorschlag. Es würde zwar so ähnlich auch funktionieren, sprengt allerdings den Code gravierend.


Hallo bastla,

genau nach so einer Lösung habe ich gesucht. Ich wusste ja, dass es eine Möglichkeit gäbe, mit welcher in dem Batch direkt nach einer Zechenfolge gesucht werden kann...
goto :M5 unterstützt, allerdings springt goto nicht an die Sprungmarke. Wenn ich „
Dennoch ist es ein klasse Ansatzpunkt, so dass ich mit einem IF-Befehl davor eventuell das Problem lösen könnte. Ich versuche es noch eine Weile weiter..


Gruß
evinben
Member: bastla
bastla May 08, 2012 at 19:39:27 (UTC)
Goto Top
Hallo evinben!

findstr /ib ":%computername%" "%~f0">nul||goto :M5
Grüße
bastla
Member: evinben
evinben May 08, 2012 at 20:00:23 (UTC)
Goto Top
Hallo bastla,

glaubst du mir wohl nicht ;)?

Irgendwo ist es faul, daher gebe ich den Code 1:1 hier:

@echo off

findstr /ib ":%COMPUTERNAME%" "%~f0"||goto :M5  

echo Pech mit GOTO-Befehl!
pause>nul & goto :eof

:M5
echo es klappt!

pause>nul & goto :eof

Das Ergebnis im CMD ist immer

:M5
Pech mit GOTO-Befehl!


Gruß
evinben
Member: bastla
bastla May 08, 2012 at 20:08:51 (UTC)
Goto Top
Hallo evinben!
glaubst du mir wohl nicht ;)?
Naja, im Hinblick darauf, dass ich erfolgreich unter W7Pro getestet hatte (und eben mit Deinem geposteten Schnipsel zur Sicherheit auch noch unter W7Enterprise - funktioniert auch da), fällt mir das zugegebener Maßen etwas schwer ... face-wink

... allerdings: Wenn ja bei Dir "findstr" einen Treffer liefert, kann eigentlich nur der Computer, an dem Du testest, "M5" heißen (was natürlich dazu führen würde, dass eben kein Sprung erfolgt) - daher einfach einmal als Sprungmarke ":nichtgefunden" verwenden ...

Grüße
bastla
Member: evinben
evinben May 08, 2012 at 20:31:42 (UTC)
Goto Top
hallo bastla,

dank deiner absolut sicheren Zusage habe ich nun folgendes gemacht:

Ich habe den obigen Code, der am Anfang der Batch-Datei sich berfindet, kopiert und in einer neu erstellten Batch-Datei eingefügt und es funktioniert!
So ein seltsames Problem ist in meiner Praxis bisher etwa 4 ... 6 Mal schon mal vorgekommen. Lösung gegen dieses Symptom habe ich noch nicht.

Jetzt werde ich Zeichen nach Zeichen die alte Datei abarbeiten und schrittweise alles was so vor Auge auf der Reihe nach löschen und testeten, bis ich den Wurm endlich erwischt habe.

Ich werde dann sofort berichten… sei gespannt!

evinben
Mitglied: 60730
60730 May 08, 2012 at 20:47:23 (UTC)
Goto Top
Moin maeddelzz und bastla.."

Ich kenn ja fast alles, aber eine zeile
Ist ja schon etwas face-wink
Goto mit doppelpunkt?

AnWay,mwas ist denn eigentlich das ziel in einem script allen computernamen einzelne unterpunkte zu geben?
Das (was das machen soll) geht doch sicherlich eleganter, obwohl eine problembatch mit fuehrendem €cho off ist ja auch mal was anderesface-sad

Gruss
Member: evinben
evinben May 08, 2012 at 20:49:33 (UTC)
Goto Top
hallo bastla,

den Wurm habe ich gefunden - er ist vor dem Computer und schreibt dir gerade ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(`-´). Es ist in der getesteten Batch-Datei tatsächlich ein Computer-Namen als Sprungmarke gewesen.
- daher einfach einmal als Sprungmarke ":nichtgefunden" verwenden ...
Zugegeben, das war ebenso vor kurzem so.

Entschuldigung für die Aufregung. Nun funktioniert alles wieder gut!

Gruß
evinben
Member: bastla
bastla May 08, 2012 at 20:58:48 (UTC)
Goto Top
Hallo evinben!

Bliebe aber noch T-Mos berechtigte Frage: Sind tatsächlich für die einzelnen Rechner derart unterschiedliche Vorgangsweisen nötig, dass eigene Programmteile erstellt werden müssen?
@t-mo
Der ":" ist kein Problem (weil er bei einem "call" ja tatsächlich gebraucht wird, schreibe ich "goto" eigentlich schon sehr lange auch gleich so) ...

Grüße
bastla
Member: evinben
evinben May 08, 2012 at 21:01:28 (UTC)
Goto Top
Hallo TimoBeil,

mwas ist denn eigentlich das ziel in einem script allen computernamen einzelne unterpunkte zu geben?
einige Computer haben ihre eigenen spezifischen Konfigurationseinstellungen, die dann beim Ausführen der Batch-Datei gesetzt werden müssen.
So wird sichergestellt, dass die Einstellungen für den jeweiligen Rechner exakt so sind, wie sie sein müssen. Falls ein Rechner sich verabschiedet oder ein neur dazu kommt, wird er anhand seines gesetzten Computernamens dann halb automatisch schnell konfiguriert.
Aber was soll ich dir das alles erzählen – du bist da, was die Automatisierung anbelangt, sicherlich extremer.

Gruß
evinben
Mitglied: 60730
60730 May 08, 2012 at 21:05:43 (UTC)
Goto Top
Salue bastla,

Naja.... "du" face-wink

Du weisst aber auch, das du bei einem unterprogramm immer mit nem doppelpunkt callgirlen musst, willst du ein anderes script anbaetscheln, dann nimmst du doch auch keine doppelnippel face-wink

Ok goto wuerde niemals nie nicht eine andere instanz mit einem anderen script starten, ausser ..... ( aber dann wuerds nur der befehl machen, der unter dem go getut wird, niemals das goto selber.


Duck und wech...

Gruesse
Member: jeb-the-batcher
jeb-the-batcher May 08, 2012 at 21:34:00 (UTC)
Goto Top
Hallo,

an sich kann man natürlich die Datei durchsuchen, ob die Sprungmarke vorhanden ist, man kann aber auch einfach bei einem Fehler des goto's direkt den Fehlertext ausgeben.
goto :%computername% 2>nul || (
  echo Dieser Computer "%computername%" ist noch nicht in der Datenbank.   
  goto :eof
)

:PC1
...
:PC2

....

Wobei das goto :eof, eher der Optik dient, als der Funktion, da es keine hat.
Denn wenn ein Sprungfehler auftritt wird der Batchfile-Kontext verlassen und nur noch der Teil in den Klammern ausgeführt.
Da man sich aber schon im cmd-line Kontext befindet, hat goto keine Funktion mehr und call :label führt zu einem Fehler.

Gruß
jeb
Member: evinben
evinben May 09, 2012 at 05:20:16 (UTC)
Goto Top
hallo Jan Erik!

Vielen Dank für den tollen Vorschlag und die klare Erklärung dazu. Ich finde diese Lösung bisher am feinsten – kurz, übersichtlich und intuitiv in einer Batch-Datei. So werde ich es gerne nun umsetzen und versuchen zukünftig das Wissen (mit so ähnlicher Methoden) einzusetzen.
Wobei das goto :eof, eher der Optik dient, als der Funktion, da es keine hat.
Denn wenn ein Sprungfehler auftritt wird der Batchfile-Kontext verlassen und nur noch der Teil in den Klammern ausgeführt.
Da man sich aber schon im cmd-line Kontext befindet, hat goto keine Funktion mehr und call :label führt zu einem Fehler.
Deine Formulierung finde ich klasse. Frischlinge wie ich brauchen es… Weiter so!

PS: Interessant warum du immer noch als Frischling aufgelistet wirst, wenn du schon kein mehr bist: Ab zur Korrektur: [code] … [/code] = <code> …
face-wink

Gruß
evinben
Member: evinben
evinben May 09, 2012 at 11:35:42 (UTC)
Goto Top
hallo jeb,

man kann aber auch einfach bei einem Fehler des goto's direkt den Fehlertext ausgeben.

dann muss die Pause auch rein, damit dein Vorschlag wirklich so funktioniert, wie du es gemeint hast (auch genau so, wie ich es haben wollte):

goto :%computername% 2>nul || (
  echo Dieser Computer "%computername%" ist noch nicht in der Datenbank.   
  pause >nul
)

:PC1
...
:PC2

....

Danke schön an alle!

Projekt abgeschlossen

Gruß
evinben
Member: evinben
evinben May 09, 2012, updated at Oct 18, 2012 at 16:50:50 (UTC)
Goto Top
Hallo Bastla,

Sind tatsächlich für die einzelnen Rechner derart unterschiedliche Vorgangsweisen nötig, dass eigene Programmteile erstellt werden müssen?
ja, warum eigentlich nicht? Nehmen wir z. B. die IP des LAN-Adapters, Grafikkarte, TouchPad und sonstiges...

Wie würdest du es mach'n? Die feine Lösung wäre sicherlich Remote. Gibt es eventuell eine einfache Möglichkeit, die ich in einem Batch in der Kopfzeile einbaue, so dass beim Ausführen nach einer Tastaturabfrage (mit set /p) ich den jeweiligen Computer aus dem lokalen Netzwerk eingeben, sodass dann alle Befehle im laufenden Batch automatisch auf dem jeweiligen PC ausgeführt werden?
Ansonsten müssten die bestehenden Batch-Dateien komplett neuumstrukturiert werden - zumindest für diejenigen Befehle, die überhaupt eine Remote-Ausführung anbieten, etwa wie netch-Syntax hier:
netsh [-a Aliasdatei] [-c Kontext] [-r Remotecomputer]
Wäre so eine Batch-Umstrukturierung speziell für Remote-Ausführung mit heutigen technischen Möglichkeiten – nämlich ein beliebiges Skript remote auf einem lokalen Computer auszuführen - immer noch sinnvoll?

Im Netz findet man einiges über Möglichkeiten mit WMI-Skript (Windows Management Instrumentation Command-line - WMIC):
http://de.wikipedia.org/wiki/Windows_Management_Instrumentation
http://techsupt.winbatch.com/ts/T000001002F15.html

Mit Batch wäre es klar lieber.
Muss ich unbedingt auf externe Tools wie PsExec von Sysinternals zugreifen, um ein Prozess auf einem anderen ausführen zu können und was haltest du persönlich davon?
Deine Antworte zu diesem Tool habe ich bereits gelesen Aufruf einer Batch-Datei auf einem anderem PC im Netzwerk, die eine EXE-Datei auf einem Netzlaufwerk startet ;). Dennoch würde mich deine Meinung sehr interessieren.

Gruß
evinben
Member: bastla
bastla May 09, 2012 at 16:54:31 (UTC)
Goto Top
Hallo evinben!

Meine Überlegung ging eher in die Richtung, dass doch vermutlich für die verschiedenen Rechner ähnliche bis gleiche Arbeitsschritte (nur eben mit unterschiedlichen Daten) anfallen würden - dann sollte es genügen, diese Daten (in welcher Form auch immer, und wenn es eine simple CSV-Datei ist) zentral bereitszustellen und bei Bedarf abzurufen ...

Grüße
bastla
Hotly discussed
gleixnerdCheck of ZFW Firewallgleixnerd - 5 CommentsjstrickerWireguard VPN on UDM Pro behind Fritzbox - Handshake did not completejstricker - 3 CommentsAlexWishaHow to set up and configure a Linux GRE tunnelAlexWisha - 3 Comments