Unterschleife in Batch
Hi,
ich habe eine Nachfrage zu diesem Thema: https://www.administrator.de/index.php?content=87521
Leider ist das Thema gesperrt.
Hier wird gezeigt, wie die Variable aus der oberen Schleife in der unteren Schleife benutzt werden kann.
Mich interessiert, warum man das nicht sowieso machen kann, und wie mit welchem Suchbegriff man gefunden hätte, dass %~nx vor die eigentliche Variable geschrieben werden muss!
Kann mir da jemand weiterhelfen?
ich habe eine Nachfrage zu diesem Thema: https://www.administrator.de/index.php?content=87521
Leider ist das Thema gesperrt.
@echo off & setlocal
for %%u in ("C:\tmp\*.*") do (
for /f "tokens=1-16 delims=-_. " %%a in ("%%~nxu") do ren "%%u" ...
Hier wird gezeigt, wie die Variable aus der oberen Schleife in der unteren Schleife benutzt werden kann.
Mich interessiert, warum man das nicht sowieso machen kann, und wie mit welchem Suchbegriff man gefunden hätte, dass %~nx vor die eigentliche Variable geschrieben werden muss!
Kann mir da jemand weiterhelfen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 105137
Url: https://administrator.de/forum/unterschleife-in-batch-105137.html
Ausgedruckt am: 22.12.2024 um 11:12 Uhr
3 Kommentare
Neuester Kommentar
Hallo Dynadrate!
Eine mögliche Alternative wäre die Zuweisung zu einer "gewöhnlichen" Variablen und die Aufteilung nach Stellenanzahl (etwa: erste 10 Stellen, Stellen 24 bis 28, letzte 3 Stellen).
Die Schleifenvariable %u enthält, wie schon angeführt, einen vollständigen Pfad und kann zerlegt werden in
Bei Bedarf sind auch der vollständige Pfad (%~fu = full path) sowie weitere Details (Größe, etc) verfügbar - Info dazu: "for /?" (gegen Ende des Hilfetextes)
Grüße
bastla
Mich interessiert, warum man das nicht sowieso machen kann
Falls Du damit die Tatsache meinst, dass die Zerlegung eine weitere Schleife erfordert: Die erste Schleife kann nur einen vollständigen Dateipfad (bzw die unten genannten Bestandteile) liefern, aber nicht den Namen nach den gewünschten Kriterien (Trennzeichen "-", "_", "." und Leerzeichen) aufteilen - deshalb eine zweite "Schleife" (die ja in diesem Fall nur einen einzigen Durchlauf für den jeweiligen Dateinamen macht).Eine mögliche Alternative wäre die Zuweisung zu einer "gewöhnlichen" Variablen und die Aufteilung nach Stellenanzahl (etwa: erste 10 Stellen, Stellen 24 bis 28, letzte 3 Stellen).
Die Schleifenvariable %u enthält, wie schon angeführt, einen vollständigen Pfad und kann zerlegt werden in
- Laufwerksangabe (%~du = drive)
- Pfad (%~pu = path)
- Dateiname (%~nu = name)
- Erweiterung (%~xu = extension)
- Kombination (%~nxu = name + extension)
Bei Bedarf sind auch der vollständige Pfad (%~fu = full path) sowie weitere Details (Größe, etc) verfügbar - Info dazu: "for /?" (gegen Ende des Hilfetextes)
Grüße
bastla
Moin Dynadrate,
nur ergänzend zu @bastlas Ausführungen die zwei kurzen Fäden, die ich Dir in Hand gedrückt hätte, um das Knäuel zu entwirren:
Faden 1)
Der richtige Suchbegriff am CMD-Prompt wäre - entgegen aller Wahrscheinlichkeit - in der Tat
die Suche nach "%~" in der Hilfe zur FOR-Anweisung.
Faden 2)
FOR-Anweisungen musst Du immer "von innen nach aussen" lesen bzw. nachvollziehen.
Im "innersten" bzw letzten in Klammern eingeschlossenen Ausdruck steht die kleinste Einheit, die als Input für eine FOR-Anweisung dient (und durch die FOR-Anweisung noch feiner zerbröselt werden soll).
Im obigen Beispiel ist die "kleinste Einheit", mit der irgendetwas gemacht werden soll, der Dateiname [+Extension] OHNE Laufwerk/Pfadangaben.
Und wenn Du weißt, dass Du eben nur Namen/Extension der Datei im Auge hast/benötigst, dann kommst Du über diesen Weg irgendwann auf diese "%~nxu"-Syntaxkapriolen.
P.S. Und den anderen Thread musste ich damals so schnell schliessen, weil @Dani ja sogar bei "Delayed Expansion" irgendwelche erotischen Phantasien hatte... deshalb fiel der Beitrag so schnell der FSK zum Opfer.
Oder, wie Dani sagen würde, der FGMSK.
Grüße
Biber
nur ergänzend zu @bastlas Ausführungen die zwei kurzen Fäden, die ich Dir in Hand gedrückt hätte, um das Knäuel zu entwirren:
Mich interessiert, [..] und wie mit welchem Suchbegriff man gefunden hätte,
dass %~nx vor die eigentliche Variable geschrieben werden muss!
dass %~nx vor die eigentliche Variable geschrieben werden muss!
Faden 1)
Der richtige Suchbegriff am CMD-Prompt wäre - entgegen aller Wahrscheinlichkeit - in der Tat
die Suche nach "%~" in der Hilfe zur FOR-Anweisung.
>for /?|findstr "%~"
%~I - Expandiert %I und entfernt alle umschließenden
%~fI - Expandiert %I zu einem vollständigen Dateinamen.
%~dI - Erzeugt nur den Laufwerkbuchstaben von %I.
%~pI - Erzeugt nur den Pfad von %I.
%~nI - Erzeugt nur den Dateinamen von %I.
%~xI - Erzeugt nur die Dateierweiterung von %I.
%~sI - Erzeugter Pfad enthält nur kurze Dateinamen.
%~aI - Erzeugt die Dateiattribute von %I.
%~tI - Erzeugt Datum und Zeit von %I.
%~zI - Erzeugt die Dateigröße von %I.
%~$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen
%~dpI - Erzeugt den Laufwerkbuchstaben und Pfad von %I.
%~nxI - Erzeugt den Dateinamen und die Dateierweiterung von %I.
%~fsI - Expandiert %I zu einem vollständigen Namen, der nur
%~dp$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen
%~ftzaI - Expandiert %I zu einer Zeile, die der Ausgabe des DIR-
Werte ersetzt werden. Der Ausdruck %~ wird durch einen gültigen Variablen-
FOR-Anweisungen musst Du immer "von innen nach aussen" lesen bzw. nachvollziehen.
Im "innersten" bzw letzten in Klammern eingeschlossenen Ausdruck steht die kleinste Einheit, die als Input für eine FOR-Anweisung dient (und durch die FOR-Anweisung noch feiner zerbröselt werden soll).
Im obigen Beispiel ist die "kleinste Einheit", mit der irgendetwas gemacht werden soll, der Dateiname [+Extension] OHNE Laufwerk/Pfadangaben.
Und wenn Du weißt, dass Du eben nur Namen/Extension der Datei im Auge hast/benötigst, dann kommst Du über diesen Weg irgendwann auf diese "%~nxu"-Syntaxkapriolen.
P.S. Und den anderen Thread musste ich damals so schnell schliessen, weil @Dani ja sogar bei "Delayed Expansion" irgendwelche erotischen Phantasien hatte... deshalb fiel der Beitrag so schnell der FSK zum Opfer.
Oder, wie Dani sagen würde, der FGMSK.
Grüße
Biber