kriegstreiber
Goto Top

FOR Schleife mit Unterverzeichnissen, die Ausgabe kürzen (tokens evtl.)

Hallo, ich hätte mal eine Frage, eine FOR Schleife treibt mich in den Wahnsinn. Es geht um folgendes:

Mein Verzeichnisbaum sieht so aus C:\!TEST!\TEST2\TEST3\TEST.TXT
Verzeichnisbaum 2 = C:\!TEST!\TEST.EXE
Ausführendes BAT Verzeichnis: C:\!TEST!

Nun die Schleife:
FOR /F "delims=*" %%I IN ('dir /b /s *.TXT') do TEST.EXE -v -d "%%I" >"%%~dpnI.lic"  

Was wird gemacht ?

Das ganze Verzeichnis C:\!TEST! und Unterordner wird nach TXT Dateien durchsucht, er findet eine im Verzeichnis C:\!TEST!\TEST2\TEST3. Die Ausgabe %%I ist nun:
C:\!TEST!\TEST2\TEST3\TEST.TXT

Also mein Befehl in der Schleife wäre nun:
TEST.EXE -v -d "C:\!TEST!\TEST2\TEST3\TEST.TXT" >"C:\!TEST!\TEST2\TEST3\TEST.lic"

Mein Problem ist, das Tool TEST.EXE kommt mit "!" im Verzeichnisbaum nicht klar ! Meine Befehlszeile MUSS so aussehen:
TEST.EXE -v -d "TEST2\TEST3\TEST.TXT" >"C:\!TEST!\TEST2\TEST3\TEST.lic"

Ich muss also die Ausgabe %%I kürzen und zwar das Laufwerk muss weg und das Ausführende Verzeichnis, ich brauche nur die Namen der Unterordner !

Aus "C:\!TEST!\TEST2\TEST3\TEST.TXT" muss "TEST2\TEST3\TEST.TXT" werden.

Leider geht %%~dI auch nicht, dann ist zwar Laufwerk weg aber immer noch der ganze Baum. Ich bräuchte da eine Lösung wie ich alles vor den Unterverzeichnissen "wegschneiden" kann.
Falls es hilfreich ist, im ausführenden BAT Verzeichnis wird sich nie eine TXT Datei befinden, daher brauche ich nur die Unterordner des ausführenden Verzeichnisses !

Content-ID: 325317

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

131381
Lösung 131381 03.01.2017 aktualisiert um 12:55:24 Uhr
Goto Top
@echo off & setlocal ENABLEDELAYEDEXPANSION
FOR /F "delims=*" %%I IN ('dir /b /s /A-D *.TXT') do (  
    set "pfad=%%~pI"  
    set "pfad=!pfad:~2!"  
    TEST.EXE -v -d "!pfad!" >"%%~dI\!pfad!%%~nI.lic"  
)
Gruß mik

edit: Korrektur.
Kriegstreiber
Kriegstreiber 03.01.2017 aktualisiert um 14:47:39 Uhr
Goto Top
Vielen Dank erstmal face-smile. Die Idee ist ja sehr gut, allerdings funktioniert es nicht. Er löst mir !pfad! nicht auf, trotz ENABLEDELAYEDEXPANSION . Versuche das aber mal mit "%" auf normalen Wege. Dann hab ich ein paar Fragen dazu:

Was bewirkt /A-D in der Schleife ? Habe das schon öfters gesehen.
Was bewirkt set "pfad=!pfad:~2!" ? Schneidet er irgenetwas ab ?

Danke auf jeden Fall schonmal face-smile

EDIT:
Das kann leider nicht funktionieren , denn mit ~2 schneidet er die ersten beiden Zeichen nur ab.

Ausgabe von :
!TEST!\TEST2\TEST3\

ändert sich nur zu:

EST!\TEST2\TEST3\
131381
131381 03.01.2017 aktualisiert um 15:08:41 Uhr
Goto Top
Zitat von @Kriegstreiber:

Vielen Dank erstmal face-smile. Die Idee ist ja sehr gut, allerdings funktioniert es nicht. Er löst mir !pfad! nicht auf, trotz ENABLEDELAYEDEXPANSION . Versuche das aber mal mit "%" auf normalen Wege. Dann hab ich ein paar Fragen dazu:

Was bewirkt /A-D in der Schleife ? Habe das schon öfters gesehen.
Ein dir /? sagts dir => es listet keine Ordner. Bei dir würde es z.B. auch Ordner mit einem Namen wie ORDNER.TXT übernehmen was bestimmt nicht gewünscht ist face-wink
Was bewirkt set "pfad=!pfad:~2!" ? Schneidet er irgenetwas ab ?
Ja die ersten beiden Zeichen.

Denn das !TEST! wird ja zu einem leeren String durh das DelayedExpansion aufgelöst, aus
C:\!TEST!\TEST2\TEST3\DATEI.TXT
wird dann
C:\\TEST2\TEST3\DATEI.TXT

Da ich hier nur set "pfad=%%~pI" verwende fällt ja der Laufwerksbuchstabe weg also sieht es dann so aus:
\\TEST2\TEST3\DATEI.TXT
mit set "pfad=!pfad:~2!" entferne ich die zwei führenden Backslashes zum finalen String:
TEST2\TEST3\DATEI.TXT

EDIT:
Das kann leider nicht funktionieren , denn mit ~2 schneidet er die ersten beiden Zeichen nur ab.
Doch Erklärung s.o. Geht hier problemlos.

Gruß
Kriegstreiber
Kriegstreiber 03.01.2017 aktualisiert um 15:25:32 Uhr
Goto Top
Wenn ich das aber jetzt richtig verstehe, funktioniert das wieder nur, wenn der Ordner das Sonderzeichen "!" hat, ansonsten ersetzt DelayedExpansion mir ja nicht den String. Das würde also bedeuten, sollte tatsächlich ein normaler pfad vorhanden sein, funktioniert die Lösung ja nicht face-sad

Aber es gäbe eine andere Möglichkeit, hier ein Beispiel:
%%I wäre: C:\TEST\IMMERDA\TEST\TXT ausgeführt wird das BAT in C:\Test. Kann ich irgendwie mit token ab IMMERDA abschneiden, das das Ergebnis: IMMERDA\TEST\TXT wäre ? Denn der erste Unterordner in meinem Tool ist immer gleich. Ich kann leider nicht von vorne rangehen, also z.B "\" als delim setzen, alles was vor IMMERDA ist kann varieren an Länge und Baum.
131381
131381 03.01.2017 aktualisiert um 15:35:35 Uhr
Goto Top
Ich habe mich nach deiner Beschreibung
Mein Verzeichnisbaum sieht so aus C:\!TEST!\TEST2\TEST3\TEST.TXT
gerichtet und damit funktioniert es.

Kann ich irgendwie mit token ab IMMERDA abschneiden, das das Ergebnis: IMMERDA\TEST\TXT wäre ?
Du solltest dir mal
http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
zum Ersetzen von Strings durchlesen face-wink