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:
Diese Liste wird mit
erstellt.
Als ausgabe bruchte ich
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 187720
Url: https://administrator.de/contentid/187720
Ausgedruckt am: 08.11.2024 um 02:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Darkprodukt!
Nur mal kurz:
- das sollte Dir doch irgendwie bekannt vorkommen ...
Unter Vermeidung der Zwischendatei dann etwa so:
Weitere Alternative: Ersetze die Zeilen 4 bis 7 durch
- nachdem der "\" am Ende abgetrennt ist, kann der Ordnername wie ein Dateiname behandelt (und demzufolge isoliert) werden ...
Grüße
bastla
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
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
setlocal EnableDelayedExpansion
for %%b in ("!ln:~,-1!") do echo %%~nxb
endlocal
Grüße
bastla
Hallo Darkprodukt!
- da der letzte Inhalt nicht mehr überschrieben wird, ist das Ergebnis dann eben "Bilder" und dieses wird in der nächsten Zeile ausgegeben ...
Grüße
bastla
In der vorschleife wird der von Zeile 02 übergebene Strink von Hinten
nach vorne gelsen deshalb !In nehme ich an.
Keineswegs - bei Verwendung von "nach vorne gelsen deshalb !In nehme ich an.
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 InhalteC:
Users
Benutzername
Desktop
Bilder
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%
bastla
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) ...
und das Verschwinden der Zahl ist Geschichte ...
Hindergrund: Wenn in %Ordner% "Ordnername 2" steht, bewirkt die Zeile
aufgelöst
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
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%
Hindergrund: Wenn in %Ordner% "Ordnername 2" steht, bewirkt die Zeile
echo %Ordner%>>%TEMP%\tempdato.txt
echo Ordnername 2>>%TEMP%\tempdato.txt
Grüße
bastla