Batch-Datei so rufen Sie eine andere batch-Datei auf eine angegebene Sprungmarke (label) oder anrufen und sofort springen eine bestimmte Bezeichnung?
Ich versuche herauszufinden, wie Datei1.bat aufrufen können Datei2.bat auf eine angegebene Sprungmarke (label).
Dachte ich, ich kann es so machen:
Datei1.bat
:config
@echo off
:setvars
set labelmarker=labelmarker
call file2.bat
pause > nul
:EOF
Datei2.bat
if %labelmarker%==labelmarker goto label4
:label1
echo it won't work...
goto EOF
:label2
echo it must work!
goto EOF
:label3
echo it didn't work...
goto EOF
:label4
echo it works!
goto EOF
:EOF
Dieser funktioniert. aber möchte ich nennen, eine Fledermaus UND das Label aus Datei1.bat.
ist es möglich mit einem steuerzeichen oder ascii-code oder so was?
wie ich versuchte
call file2.bat | goto label4 - doesn't work
call file2.bat > goto label4 - doesn't work
call file2.bat @label4 - doesn't work
Jegliche Hilfe würde sehr geschätzt werden.
Sogar, wenn es um das extrahieren einer bestimmten Bezeichnung und Inhalt in eine neue Datei wäre ok.
- Ich dachte, es würde funktionieren mit
call file2.bat:label4
oder etwas zu diesem Effekt. Leider scheint es keine solche Möglichkeit (außer bei hacking-Datei2.Fledermaus, aber dies kann manchmal in Frage).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte passieren das Etikett, das Sie wollen, zu gehen, um als parameter
Beispiel-Skripte, die
Ersten.bat
Sekunde.bat
Können Sie eine seltsame trick!
Sie können springen ein label in einer zweiten Gruppe, ohne Aufruf in der sekundären batch!
Ersten.bat
Sekunde.bat
AUSGABE
Es scheint keine Ursache, warum dem Etikett genannt wird, und warum sollte die Steuerung zurück zu der ersten.bat, als zweite charge war genannt ohne NENNEN.
Die Ursache für den ersten Punkt scheint zu sein, die den internen code der
goto
Befehl.Der zweite Punkt erklärt werden kann, wie es ist ein Anruf vor der dummy label in der ersten batch-Datei.
Die
exit /b
im zweiten.Fledermaus returns direkt auf den Aufruf (Zeile 3)first.bat
nicht auf die Anrufung dessecond.bat
in Zeile 7EDIT:, Wie zu deaktivieren Sie die sonderbare Verhalten
wenn Sie fügen Sie einen Befehl an
second.bat
es wird nicht mehr implizit Sprung zu label in Sekunde.bat.second.bat & rem
ändern, wird die Ausgabe anAUSGABE
& REM
(second.bat)
second.bat %*
add %* nach der zweiten.Fledermaus und der Heilige Gral der Argumente beugen, um Sie. Wenn Sie nicht, nicht mit Argumenten übergeben werden. Beide teilen sich das gleiche Verhalten. Jedoch, Sie können Streifen Argumente dieser Art ("Reinigung" der Aufruf, kann nützlich sein für Zyklus-Aufrufe)Gibt es mehrere Methoden oder tricks, die es erlaubt, dies zu tun. In dieser Lösung wird der trick besteht in der ändern Sie den Kontext des Laufenden Programms, um die zweite Batch-Datei. Nach dieser änderung, alle Etiketten in der zweiten Batch-Datei wird lokalen labels des Laufenden Programms, so dass Sie direkt aufgerufen, über die üblichen
call :label
- Befehl, der kann sich auch auf die Argumente in eine ganz übliche Weise. Der Kontext des Laufenden Programms wiederhergestellt werden muss, bevor das Programm beendet wird.Den Weg, um den Kontext zu ändern, bestehen nur umbenennen die zweite Batch-Datei mit dem gleichen Namen der erste (und benennen Sie die erste, der jedem anderen Namen) also wenn die Batch-Datei Prozessor sieht für ein label, es ist wirklich durchsuchen Sie die Inhalte der zweiten Datei! Die Dateien müssen umbenannt werden, wieder Ihren ursprünglichen Namen, bevor das Programm beendet wird. Der Schlüssel Punkt das macht diese Methode funktioniert ist, dass beide Sätze von rename-Befehle (und alle code zwischen Ihnen), müssen in Klammern; auf diese Weise, den code zuerst analysiert und dann ausgeführt aus dem Speicher, also das umbenennen der Dateien auf der Festplatte nicht beeinflussen. Natürlich, dieser Punkt bedeutet, dass der Zugriff auf die Werte aller Variablen in den code getan werden muss, über die Verspätung !Erweiterung! (oder mit der
call %%variable%%
trick).Ersten.bat
Sekunde.bat
AUSGABE
Sollten Sie beachten, dass diese Methode ermöglicht entwickeln, die Unterprogramme in der ersten Datei in der üblichen Weise (ohne Kontext ändern) und dann bewegen Sie einfach den ausgefüllten Unterprogrammen, die zweite/Bibliothek-Datei, weil die Art und Weise, Sie zu nennen ist genau das gleiche in beiden Fällen. Diese Methode erfordert keine änderungen, die in der zweiten/Bibliothek-Datei oder in der Art, wie Unterprogramme aufgerufen werden; es muss nur stecken Sie die zwei kleinen Blöcke umbenennen Befehle in der ersten Datei.
BEARBEITEN: die Wiederherstellung von Dateien, wenn ein run-time Fehler passieren
Wie angegeben in einem Kommentar, wenn Sie eine Laufzeit-Fehler auftreten, nachdem die Dateien wurden umbenannt, die Dateien werden nicht umbenannt, zurück an Ihre ursprünglichen Namen; es ist jedoch sehr leicht zu erkennen, dieser situation durch die Anwesenheit des zweiten.bat-Datei und die Dateien wiederherzustellen, wenn eine solche Datei nicht existiert. Dieser test kann getan werden, in einer supervisor-Abschnitt, führen Sie den original-code in einer separaten cmd.exe Kontext, so wird dieser Abschnitt immer komplett richtig, auch wenn der ursprüngliche code wurde abgebrochen durch einen Fehler.
Ersten.bat
Sekunde.bat
AUSGABE
:)
Ich nur ein Skript erstellt, dass könnte sich als nützlich erweisen, um Sie. Ich denke, dass es Stärke ist, dass Sie nicht haben, um ändern Sie Ihr Skript namens in keiner Weise. Ich bin mir sicher, mit ein bisschen Zeit können Sie perfekt und passen Ihren Zweck. Ich kann auch herausfinden, dass Sie nicht schnell genug für die Produktion verwenden, wenn das aufgerufene script ist groß. Diese Methode besteht in der Platzierung mein script in den Ordner Ihrer eigenen scripts, und verwenden Sie es wie so:
BEARBEITEN
Nun dieses Skript funktioniert aus jedem Verzeichnis und kann eingegeben werden, entweder vollständige oder relative Pfade zu den aufgerufenen script, mit oder ohne Datei-Endung (C:\scripts\script, C:\scripts\script.bat, .\scripts\script.cmd, etc)
Verwendung:
Gegeben, ein Beispiel-Skript Skript.bat:
Folgende Eingabe:
Ausgeben sollte:
Quellcode CALLAT.bat:
Wie gesagt in dem Kommentar, den ich an meine Antwort, ich erhielt das Kopfgeld, da @NicoBerrogorry nahm sich die Zeit zu entwickeln, eine hervorragende Lösung und bieten ein komplettes schreiben.
Dennoch, es war ein syntax Fehler, dass er übersehen, wahrscheinlich, weil er nicht die CMD - Dateien, während ich fast völlig aufgegeben BAT - Dateien. Die folgenden CALLAT Skript beinhaltet eine Korrektur und vier Erweiterungen.
HTML:
Schließlich, diese version von CALLAT entfällt eine redundante ECHO OFF und die abschließende ENDLOCAL, die ich vor langer Zeit entdeckt, ist unnötig, weil aus dem Skript impliziert ENDLOCAL.
Da fast alle meiner Produktion scripts bewohnen ein einzelnes Verzeichnis, das zugänglich ist über den Verzeichnis-PFAD-Liste, die Anforderung, dass beide Skripte bewohnen das gleiche Verzeichnis ist nicht eine erhebliche Behinderung. Außerdem, mit ein wenig mehr Arbeit, es könnte fast sicher sein, entspannt. Das überlasse ich Ihnen als übung für den interessierten Leser, aber ich gebe dir einen Anhaltspunkt; es könnte bedeuten, aufrufen ein internes Unterprogramm, das Parsen der name der input-Datei durch den Einsatz der beschriebenen Technik [im Command-Line-Parameter].Eins
Oben gezeigten Skript ist zu finden Ihren Weg in die Produktion.