Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

08.05.2012, aktualisiert 18.10.2012, 5587 Aufrufe, 17 Kommentare

Hallo!

Diesmal habe ich ein seltsames Problem:

Eine Batch-Datei wird auf unterschiedlichen PCs ausgeführt. In der Batch-Datei steht:
01.
goto :%COMPUTERNAME% 
02.
 
03.
:PC1 
04.
call …. 
05.
 
06.
:PC2 
07.
call …. 
08.
 
09.
:PC3 
10.
call …. 
11.
 
12.
pause 
13.
goto :eof 
14.
 
15.
 
16.
:M5 
17.
:Meldung ausgeben 
18.
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
Mitglied: Hitman4021
08.05.2012 um 18:54 Uhr
Hallo,

Goto beendet bei fehlenden Sprungmarken immer.

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

Gruß
Bitte warten ..
Mitglied: bastla
08.05.2012 um 19:16 Uhr
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
Bitte warten ..
Mitglied: evinben
08.05.2012 um 21:28 Uhr
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...
Du arbeitest noch mit XP. In Windows 7 wird zwar vom CMD so eine Kombination …||goto :M5 unterstützt, allerdings springt goto nicht an die Sprungmarke. Wenn ich „||“ durch „&&“ oder „&“ ersetze, dann macht goto zwar seine Sache. Der dabei sich ergebende Nachteil ist dir wohl klar: Findet findstr die Zeichenfolge nicht, dann wird dennoch goto ausgelöst.
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..

Ich freue mich über deine Kommentare und Verbesserungsvorschläge als eine Alternative zu der interessante Lösung mit „||“. Leider funktioniert das Letzte bei mir hier nicht.

Gruß
evinben
Bitte warten ..
Mitglied: bastla
08.05.2012 um 21:39 Uhr
Hallo evinben!

Ich spendiere noch ein "i" - aber dann muss auch unter W7 gut sein (weil auch dort "||" als Ersatz für "if errorlevel 1" verwendbar ist) ...
findstr /ib ":%computername%" "%~f0">nul||goto :M5
Grüße
bastla
Bitte warten ..
Mitglied: evinben
08.05.2012 um 22:00 Uhr
Hallo bastla,

glaubst du mir wohl nicht ;)?

findstr findet zwar die Sprungmarke :M5 und diese wird mir im CMD angezeigt (wenn >nul vor ||goto :M5 mal kurz für den Test entfernt wird).
Irgendwo ist es faul, daher gebe ich den Code 1:1 hier:

01.
@echo off 
02.
 
03.
findstr /ib ":%COMPUTERNAME%" "%~f0"||goto :M5 
04.
 
05.
echo Pech mit GOTO-Befehl! 
06.
pause>nul & goto :eof 
07.
 
08.
:M5 
09.
echo es klappt! 
10.
 
11.
pause>nul & goto :eof
Das Ergebnis im CMD ist immer

:M5
Pech mit GOTO-Befehl!


Gruß
evinben
Bitte warten ..
Mitglied: bastla
08.05.2012 um 22:08 Uhr
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 ...

... 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
Bitte warten ..
Mitglied: evinben
08.05.2012 um 22:31 Uhr
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
Bitte warten ..
Mitglied: 60730
08.05.2012 um 22:47 Uhr
Moin maeddelzz und bastla.."

Ich kenn ja fast alles, aber eine zeile
03. findstr /ib ":%COMPUTERNAME%" "%~f0"||goto :M5 
Ist ja schon etwas
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 anderes

Gruss
Bitte warten ..
Mitglied: evinben
08.05.2012 um 22:49 Uhr
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
Bitte warten ..
Mitglied: bastla
08.05.2012 um 22:58 Uhr
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
Bitte warten ..
Mitglied: evinben
08.05.2012 um 23:01 Uhr
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
Bitte warten ..
Mitglied: 60730
08.05.2012 um 23:05 Uhr
Salue bastla,

Naja.... "du"

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

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
Bitte warten ..
Mitglied: jeb-the-batcher
08.05.2012 um 23:34 Uhr
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.
01.
goto :%computername% 2>nul || ( 
02.
  echo Dieser Computer "%computername%" ist noch nicht in der Datenbank.  
03.
  goto :eof 
04.
05.
 
06.
:PC1 
07.
... 
08.
:PC2 
09.
 
10.
....
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
Bitte warten ..
Mitglied: evinben
09.05.2012 um 07:20 Uhr
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> … </code>


Gruß
evinben
Bitte warten ..
Mitglied: evinben
09.05.2012 um 13:35 Uhr
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):

01.
goto :%computername% 2>nul || ( 
02.
  echo Dieser Computer "%computername%" ist noch nicht in der Datenbank.  
03.
  pause >nul 
04.
05.
 
06.
:PC1 
07.
... 
08.
:PC2 
09.
 
10.
....
Danke schön an alle!

Projekt abgeschlossen

Gruß
evinben
Bitte warten ..
Mitglied: evinben
09.05.2012, aktualisiert 18.10.2012
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 http://www.administrator.de/forum/aufruf-einer-batch-datei-auf-einem-an ... ;). Dennoch würde mich deine Meinung sehr interessieren.

Gruß
evinben
Bitte warten ..
Mitglied: bastla
09.05.2012 um 18:54 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Ä in batch Datei (12)

Frage von BergEnte zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...