bredack
Goto Top

Dateinamen auslesen, zwischenspeichern, kürzen und als Ordnernamen benutzen

Hiho,

ich hab mich in letzter Zeit nen bissel mit Batch beschäftigt und hab nun folgende Aufgabe:

Ich soll aus einem Ordner, der mehrere Dateien (glaub PDFs) enthält diese gruppieren, also die Dateien mit den entsprechenden Namen in den zugehörigen neuen Ordner zu verschieben.
D.h. es wird jeden Tag eine neue Datei hinzukommen und die hat in etwa die Namenstruktur wie 2008_04_06_blubb.pdf.
Die Aktuellest, also neueste Datei von dem Tag soll in dem Standardordner bleiben und erst dann verschoben werden, bis eine andere neue Datei auftaucht.

Habe mir das so gedacht, dass man den Dateinamen ausliest, dann halt in ner Variable zwischenspeichert und dann irgendwie kürzt, also dass dann nur zb: "2008_04" übrig bleibt, was man dann als Ordnernamen verwendet für den jeweiligen Monat.

Der Ordner mit dem Namen wird dann erstellt und die älteren Dateien mit den Daten werden dann dort hinein verschoben.

Ich bin mit dem File schon soweit, dass ich die Dateien auslesen und die neueste Filtern kann, aber kann halt nicht den Dateinamen kürzen...

Danke schonmal
Mfg
Bredack

Content-Key: 87209

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

Printed on: April 23, 2024 at 15:04 o'clock

Member: Biber
Biber May 08, 2008 at 07:57:03 (UTC)
Goto Top
Moin bredack,

vielleicht hilft Dir folgende Demo-Zeile am CMD-Prompt nach zweimaligem Lesen:
>for %a in (d:\temp\20??_*.pdf) do @for /f "delims=_ tokens=1-2" %i in ("%~nxa") do @echo move %a %~dpa%i_%j\  
move d:\temp\2008_04_06_blubb.pdf d:\temp\2008_04\
[Eingabezeile hat ein ">" als Prompt; Zeile 2 ist Ausgabe]
In diesem Beispiel würden alle Dateien mit dem Muster "d:\temp\20??_*.pdf" angefasst, die Dateinamen zerlegt mit einem angenommenen Trennzeichen "_" und daraus ein Unterverzeichnisname aus den ersten zwei Tokens zusammengebraten.

Die Ermittlung/Filterung nach "neuester Datei" ist nicht Bestandteil der Zeile.

Grüße
Biber
Member: Bredack
Bredack May 08, 2008 at 08:20:25 (UTC)
Goto Top
Danke Biber für die schnelle Antwort, aber irgendwie klappt das nich so ganz face-sad

wozu is denn das ">"? Wenn ich es weglasse passiert gar nix, wenn es bleibt wird der Pfad nich gefunden.
was macht das ("%~nxa") und das hinter dem move?
%a is der dateiname?
%~dpa`
%i 1. Token?
%j 2. Token?

hab das mal eben auf mein Ordner übertragen: (ich teste noch mit *.txt files face-smile)

for %a in (H:\20??_*.txt) do @for /f "delims=_ tokens=1-2" %i in ("%~nxa") do @echo move %a %~dpa%i_%j\
rem move d:\temp\2008_04_06_blubb.pdf d:\temp\2008_04\
Member: Biber
Biber May 08, 2008 at 08:46:07 (UTC)
Goto Top
Moin Bredack,

wozu is denn das ">"? Wenn ich es weglasse passiert gar nix, wenn es bleibt wird der Pfad nich gefunden.
Das ">" NICHT mit eingeben; es gehört einfach mit zu meinem CMD-Prompt.
Windows-Standard ist der Prompt "C:\Dokumente und Einstellungen\User\Eigene Dateien>" bzw $P$G (Anzeige Lw/Pfad gefolgt von einem Größer-Zeichen.
Bei mir ist es nur das Größerzeichen.
was macht das ("%~nxa") und das hinter dem move?
die Auflösung von dynamischen Variablen wird in der Hilfe zu FOR ("FOR /?" am CMD-Prompt eingeben) auf der letzten Seite sehr gut beschrieben.
Mit %~ni bekomme ich den (Datei-)Namen der Variablen %i, mit %~pi den Pfad, mit %~di den Drive etc...
%a is der dateiname?
%a ist die Laufvariable %a, die gefüllt wird mit allen %a's aus "FOR %a in (H:\20??_*.txt)"
Es würde sich nur mit der ersten FOR-Anweisung bei Dir ergeben.
>for %a in (H:\20??_*.txt) do @echo %a
H:\2008_04_06_blubb.pdf
....(ggf. weitere Dateien)
%~dpa
"nur" Drive und Path von %a --->"H:\"
%i 1. Token?
%j 2. Token?
Jepp. Da ich bei %i anfange zu zählen (FOR /F ...%i in .."), werden alle sich ergebenden "Folgevariablen" alphabetisch hochgezählt...%i, %j, %k....

Spiel mal (nach Überfliegen der FOR /?-Hilfe) zwei Minuten mit den beiden FOR-Anweisungen einzeln am CMD-Prompt. Dann wirds klarer.

Wenn nicht...melde Dich.
Grüße
Biber
Member: Bredack
Bredack May 08, 2008 at 09:02:03 (UTC)
Goto Top
mh..joa mit dem ">" hätt ich drauf kommen müssen face-smile

Und mit der For /? hab ich auch schon nen weilchen gespielt face-smile

ich teste auch die Schleife zb mit:
for %a in (H:\20??_*.txt) do @echo %a

aber es passiert einfach nix, das Batchfile wird an der Stelle einfach abgebrochen, trotz "pause" etc, genauso sieht es bei deiner Zeile aus, weiss nich genau woran es liegt, aber könnte es an der Laufwerksbezeichnung liegen also das (H:\20??_*txt) ?

Und noch ne Frage: warum sind Laufvariablen manchmal mit einem %-Zeichen deklariert und mal mit 2? Also: for /F %%i in... oder for %i in ...

Danke schonmal
MfG Bredack
Member: Bredack
Bredack May 08, 2008 at 09:18:00 (UTC)
Goto Top
Ich antworte mir mal selbst :D

als mit
for /F "delims=_ tokens=1-2" %%i in ('dir /b 20??_*.txt') do @echo %%i_%%j
kann ich die ersten 2 Tokens ausgeben, soweit so gut, aber dafür muss die Batchdatei ja im gleichen Vereichnis sein, wie bekomm ich das hin, dass trotzdem der Pfad mit angegeben werden kann, da ja das "for %a in (H:\20??_*.txt) " nicht funktioniert.
Member: Biber
Biber May 08, 2008 at 09:26:54 (UTC)
Goto Top
nur die Ruhe, Bredack,

wenn ich irgendwo schreibe, "...am CMD-Prompt..", dann bedeutet das das Abfeuern der entsprechenden Halbzeile vom CMD-Prompt.

Dann haben alle dynamischen Variablen EIN Prozentzeichen (%i, %j, %a,...)
Damit kannst Du alles erstmal testen.

Wenn es klappt (oder "wenn es denn wider Erwarten jemals klappen sollte", wie wir Biber sagen), dann kannst Du es in einer Batchdatei dauerhaft der Nachwelt erhalten.
Erst dann bekommen die Laufvariablen ihr zweites Prozentzeichen (%%i, %%j,...%%~dpa..)
Sozusagen als Prüfsiegel "ohne größere Beanstandungen trocken getestet".

Bitte teste es erstmal am Prompt.

Grüße
Biber
Member: Bredack
Bredack May 08, 2008 at 10:00:55 (UTC)
Goto Top
Hey Biber,

Ok, bei den Test auf der Commandozeile geht alles glatt, nur wenn ich diese dann in einer Batch ausführe, die dann Befehle, wie
for /F %%a in ('dir /b 20??_*.txt') do echo %~dpa
bricht sie ab.
Es legt an dem "%~dpa" genausowenig gehn %~da, fa oder pa.
Keine Ahnung warum dies dort nicht geht.
Desshalb hat deine gepostete Codezeile nicht funktioniert, woran könnte das liegen?

und direkt den Pfad kann ich auch nicht angeben, weder auf der Commandoebene noch in der Batch face-sad Muss es bis jetz über das ('dir') Lösen

mfg Bredack
Member: bastla
bastla May 08, 2008 at 13:37:48 (UTC)
Goto Top
Hallo Bredack!

Es legt an dem "%~dpa" genausowenig gehn %~da, fa oder pa.
Konsequenter Weise ist natürlich auch bei "%~dpa" ein zweites "%"-Zeichen fällig ...

Muss es bis jetz über das ('dir') Lösen
Das "dir" kannst Du Dir schenken, wenn Du, so wie Biber oben, nur ein "for " ohne "/f" verwendest.

Übrigens könntest Du beim Posten Deine Batch-Zeilen zwischen -Tags stellen ...

Grüße
bastla
Member: Bredack
Bredack May 13, 2008 at 07:19:37 (UTC)
Goto Top
Danke erstmal für die Hilfe, soweit klappt das auch alles, nur hab ich mal ne Frage:
Wie kann ich in den Folgenden Zeilen direkt auf den Filenamen zugreifen?

 set path=H:\
 set Filter=20??_*.txt
 set Filter2=*.txt
 
for /F %%i in ('dir /b /od /a -d %Filter%')do (  
  set newest=%%i 
)

  for /F "delims=_ tokens=1-2" %%i in ('dir /b %Filter%') do (  
    if not exist %%i_%%j (
      md %%i_%%j
    )
    if exist %%i_%%j (
      echo %%i_%%j vorhanden!
    )else echo %%i_%%j nicht vorhanden!
    if /I %newest% NEQ %%i_%%j%Filter2%(
      copy %%i_%%j%Filter2% %path%\%%i_%%j\
    )
  )

Also ich würde gerne halt in der If Abfrage mit dem NEQ nur die Dateien kopieren, die auch nich die neusten sind, nur komm ich da leider nich an den vollständigen Dateinamen ran, mit %%~nxi geht es leider nicht face-sad

MfG Bredack
Member: bastla
bastla May 13, 2008 at 07:29:03 (UTC)
Goto Top
Hallo Bredack!

Die Schreibweise "%%~fi" liefert den Dateinamen mit vollständigem Pfad (nachzulesen in der Hilfe zu "for", zB mit "for /?"), allerdings nicht bei Verwendung von "for /F" - hier müsstest Du den Pfad dann selbst hinzufügen ...

Grüße
bastla
Member: Bredack
Bredack May 13, 2008 at 07:33:51 (UTC)
Goto Top
Hallo Bredack!

Die Schreibweise "%%~fi" liefert
den Dateinamen mit vollständigem Pfad
(nachzulesen in der Hilfe zu "for",
zB mit "for /?"), allerdings nicht
bei Verwendung von "for /F" ...

Grüße
bastla

Leider geht das nicht, da bei %%~fi nur das erste Token mit dem Pfad ausgeben wird, aber leider nicht der Komplette Dateinameface-sad
Bsp: Ausgabe: H:\2008 aber der Dateiname ist: 2008_05_13_bla.txt
Also sollte der komplette und richtige Dateiname ausgeben werden, nicht das erste Token %%i, geht das irgendwie?

MfG Bredack
Member: bastla
bastla May 13, 2008 at 07:40:23 (UTC)
Goto Top
Hallo Bredack!

Bei nochmaligem Hinsehen war mir auch schon aufgefallen, dass es nicht beim Pfad klemmt ...

Ändere die Zeile
for /F "delims=_ tokens=1-2" %%i in ('dir /b %Filter%') do (  
auf
for /F "delims=_ tokens=1-2*" %%i in ('dir /b %Filter%') do (  
Du bekommst dadurch die einzelnen Namensbestandteile in die Variablen %%i (Jahr), %%j (Monat) und %%k (Rest ab Tag) - diese kannst Du wieder mit "%%i_%%j_%%k" zusammensetzen.

Grüße
bastla
Member: Bredack
Bredack May 13, 2008 at 07:47:27 (UTC)
Goto Top
Super, danke jetz klappt auch alles perfekt, dankeschön euch allen face-smile