darkprodukt
Goto Top

BATCH Erweiterung von Laufvariablen so das ich nur den Lezten Ordner der Pfad angabe ohne Schrägstrich als ausgabe habe.

Ich habe eine Datei Tempdatp.txt die mit Dateipfaden gefüllt ist aber ohne die Dateinamen.

Also so:
C:\Users\Benutzername\Desktop\Bilder\
C:\Users\Benutzername\Desktop\Bilder\
C:\Users\Benutzername\Desktop\Bilder\
C:\Users\Benutzername\Filme\
C:\Users\Benutzername\Filme\
C:\Users\Benutzername\
C:\Users\Benutzername\Daten\
C:\Users\Benutzername\Desktop\Daten\
C:\Programme\ 
C:\User\ 
C:\User\Benutzername2\ 
C:\Users\Benutzername2\Desktop\ 
...

Diese Liste wird mit
for /f "usebackq delims=" %%i in ("Struck.txt") do for /f "delims=" %%j in ('dir /a-s-h-d /b /s "%%~i"') do echo %%~dpj >>%TEMP%\tempdatp.txt  
erstellt.

Als ausgabe bruchte ich
Bilder
Bilder
Bilder
Filme
Filme
Benutzername
Daten
Daten
....

Wenn es möglich ist kan es auch gleich mit einer abgeänderten for-schleife gemacht werden. Der Zwischenschritt ist nicht nötig.

Habe mich mit diesem Tut auseinandergesetzt und "Erweiterung von Laufvariablen" gefunden (was ich schon teilweise wuste), aber eben nicht wie ich nur den Ordner bekomme. Tutorial zur FOR-Schleife

Grüße
Darkprodukt

Content-ID: 187720

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

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

bastla
bastla 10.07.2012 aktualisiert um 10:38:06 Uhr
Goto Top
Hallo Darkprodukt!

Nur mal kurz:
@echo off &setlocal
for /f "usebackq delims=" %%a in ("tempdatp.txt") do (  
  set "ln=%%a"  
  setlocal EnableDelayedExpansion
    for %%b in ("!ln:\=" "!") do if %%b neq "" set "Ordner=%%~b"  
    echo !Ordner!
  endlocal
)
pause
- das sollte Dir doch irgendwie bekannt vorkommen ... face-wink

Unter Vermeidung der Zwischendatei dann etwa so:
@echo off &setlocal
for /f "usebackq delims=" %%i in ("Struck.txt") do for /f "delims=" %%j in ('dir /a-s-h-d /b /s "%%~i"') do (  
    set "ln=%%~dpj"  
    setlocal EnableDelayedExpansion
      for %%b in ("!ln:\=" "!") do if %%b neq "" set "Ordner=%%~b"  
      echo !Ordner!
    endlocal
)
pause
Weitere Alternative: Ersetze die Zeilen 4 bis 7 durch
  setlocal EnableDelayedExpansion
    for %%b in ("!ln:~,-1!") do echo %%~nxb  
  endlocal
- nachdem der "\" am Ende abgetrennt ist, kann der Ordnername wie ein Dateiname behandelt (und demzufolge isoliert) werden ...

Grüße
bastla
Darkprodukt
Darkprodukt 10.07.2012 um 15:18:07 Uhr
Goto Top
Die Strucktur sieht bekannt aus.

Aber ich verstehe Zeile 05 nicht.

In der vorschleife wird der von Zeile 02 übergebene Strink von Hinten
nach vorne gelsen deshalb !In nehme ich an.
Danach wird bis zum ersten "\" gelesen, wobei der erste Ignoriert wird.

Alles gelesene ist in %%b.

In der if anweisung wird nun geschaut ob %%b überhaupt etwas enthält
und fals sie was enthält wird sie in die Variable Ordner geschrieben,
die Wiederum ausgegeben wird.

Stimmt das so?
Fungtioniert das auch mit ! im Namen?
Weil ("!ln:\=" "!") oder wozu ist das --> "!" gut?
bastla
bastla 10.07.2012 aktualisiert um 16:28:33 Uhr
Goto Top
Hallo Darkprodukt!
In der vorschleife wird der von Zeile 02 übergebene Strink von Hinten
nach vorne gelsen deshalb !In nehme ich an.
Keineswegs - bei Verwendung von "delayedexpansion" werden Variablennamen anstatt mit "%" mit "!" geschrieben - daher also nicht %ln% sondern !ln!.
Danach wird bis zum ersten "\" gelesen, wobei der erste Ignoriert wird.
Wieder daneben - es wird das letzte Zeichen (der störende "\") abgeschnitten.
Alles gelesene ist in %%b.
Auch nicht ganz richtig - durch die Ersetzung der Trennzeichen (dieses Mal nicht _ sondern eben \) durch " " werden alle Pfadbestandteile der Reihe nach in %%b übernommen - da jedes Mal der Inhalt von %%b (wenn es denn einen gibt, deshalb die Abrage nach "") in die Variable Ordner geschrieben wird, steht am Ende der letzte Pfadbestanteil in der Variablen - anhand der ersten Beispielzeile hat die Variable daher in der Schleife der Reihe nach die Inhalte
C:
Users
Benutzername
Desktop
Bilder
- da der letzte Inhalt nicht mehr überschrieben wird, ist das Ergebnis dann eben "Bilder" und dieses wird in der nächsten Zeile ausgegeben ...
Fungtioniert das auch mit ! im Namen?
Abgesehen davon, dass Du das ja wohl schon hättest testen können: leiner nein - als Workaround kann ein Unterprogramm verwendet werden:
@echo off &setlocal
for /f "usebackq delims=" %%i in ("Struck.txt") do for /f "delims=" %%j in ('dir /a-s-h-d /b /s "%%~i"') do set "ln=%%~dpj" & call :ProcessLine  
pause
goto :eof

:ProcessLine
for %%b in ("%ln:\=" "%") do if %%b neq "" set "Ordner=%%~b"  
echo %Ordner%
Grüße
bastla
Darkprodukt
Darkprodukt 10.07.2012 um 17:01:28 Uhr
Goto Top
Ok, hab hinter echo %Ordner% natürlich noch >>%TEMP%\tempdato.txt gesetzt und die Sprungmarke :ProcessLine ans ende meiner (220 Zeilen) Datei gehängt.

Jezt hab ich aber einen komischen Fehler...
Ich habe 3 Ordner die so Heißen:
Ordnername!
Ordnername 2 OVA
Ordnername 2

Jezt schaut meine ausgabe so aus:
Ordnername! //+ Für jede Datei einmal
Ordnername 2 OVA //+Für jede Datei einmal

Auserdem bekomme ich als echo Ordnername //+ Für jede Datei und auserdem fehlt die Zahl.

Wiso bekomme ich das als echo ich habs doch in die Datei geleitet... auserdem fehlt jezt die Zahl
bastla
bastla 10.07.2012 aktualisiert um 20:24:39 Uhr
Goto Top
Hallo Darkprodukt!

Dass es den Ordnernamen für jede einzelne Datei gibt, ist klar (und auch in Deinem Beispiel oben schon so und war bisher auch nicht anders gewünscht) ...
Ok, hab hinter echo %Ordner% natürlich noch >>%TEMP%\tempdato.txt gesetzt
Zweitbeste Variante - schreib die Umleitung davor, also:
>>%TEMP%\tempdato.txt echo %Ordner%
und das Verschwinden der Zahl ist Geschichte ...

Hindergrund: Wenn in %Ordner% "Ordnername 2" steht, bewirkt die Zeile
echo %Ordner%>>%TEMP%\tempdato.txt
aufgelöst
echo Ordnername 2>>%TEMP%\tempdato.txt
und damit die Umleitung nur der Ausgabe einer Fehlermeldung auf STDERR (Kanal 2) in die Datei "%TEMP%\tempdato.txt" (und da kommt natürlich nix, da ja kein Fehler auftritt) ...

Grüße
bastla
Darkprodukt
Darkprodukt 10.07.2012 um 17:40:45 Uhr
Goto Top
Ok danke

Super Hilfe

Grüße Darkprodukt