Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: Bredack

Bredack (Level 1) - Jetzt verbinden

08.05.2008, aktualisiert 13.05.2008, 11150 Aufrufe, 13 Kommentare

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
Mit freundlichen Grüßen
Bredack
Mitglied: Biber
08.05.2008 um 09:57 Uhr
Moin bredack,

vielleicht hilft Dir folgende Demo-Zeile am CMD-Prompt nach zweimaligem Lesen:
01.
>for %a in (d:\temp\20??_*.pdf) do @for /f "delims=_ tokens=1-2" %i in ("%~nxa") do @echo move %a %~dpa%i_%j\ 
02.
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
Bitte warten ..
Mitglied: Bredack
08.05.2008 um 10:20 Uhr
Danke Biber für die schnelle Antwort, aber irgendwie klappt das nich so ganz

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 )

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\
Bitte warten ..
Mitglied: Biber
08.05.2008 um 10:46 Uhr
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.
01.
>for %a in (H:\20??_*.txt) do @echo %a 
02.
H:\2008_04_06_blubb.pdf 
03.
....(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
Bitte warten ..
Mitglied: Bredack
08.05.2008 um 11:02 Uhr
mh..joa mit dem ">" hätt ich drauf kommen müssen

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

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
Mit freundlichen Grüßen Bredack
Bitte warten ..
Mitglied: Bredack
08.05.2008 um 11:18 Uhr
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.
Bitte warten ..
Mitglied: Biber
08.05.2008 um 11:26 Uhr
....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
Bitte warten ..
Mitglied: Bredack
08.05.2008 um 12:00 Uhr
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 Muss es bis jetz über das ('dir') Lösen

Mit freundlichen Grüßen Bredack
Bitte warten ..
Mitglied: bastla
08.05.2008 um 15:37 Uhr
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 <code></code>-Tags stellen ...

Grüße
bastla
Bitte warten ..
Mitglied: Bredack
13.05.2008 um 09:19 Uhr
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?

01.
 set path=H:\ 
02.
 set Filter=20??_*.txt 
03.
 set Filter2=*.txt 
04.
  
05.
for /F %%i in ('dir /b /od /a -d %Filter%')do ( 
06.
  set newest=%%i  
07.
08.
 
09.
  for /F "delims=_ tokens=1-2" %%i in ('dir /b %Filter%') do ( 
10.
    if not exist %%i_%%j ( 
11.
      md %%i_%%j 
12.
13.
    if exist %%i_%%j ( 
14.
      echo %%i_%%j vorhanden! 
15.
    )else echo %%i_%%j nicht vorhanden! 
16.
    if /I %newest% NEQ %%i_%%j%Filter2%( 
17.
      copy %%i_%%j%Filter2% %path%\%%i_%%j\ 
18.
19.
  )
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

Mit freundlichen Grüßen Bredack
Bitte warten ..
Mitglied: bastla
13.05.2008 um 09:29 Uhr
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
Bitte warten ..
Mitglied: Bredack
13.05.2008 um 09:33 Uhr
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 Dateiname
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?

Mit freundlichen Grüßen Bredack
Bitte warten ..
Mitglied: bastla
13.05.2008 um 09:40 Uhr
Hallo Bredack!

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

Ändere die Zeile
01.
for /F "delims=_ tokens=1-2" %%i in ('dir /b %Filter%') do (
auf
01.
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
Bitte warten ..
Mitglied: Bredack
13.05.2008 um 09:47 Uhr
Super, danke jetz klappt auch alles perfekt, dankeschön euch allen
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...