Dateien nach Teilstring aus Dateinamen kopieren
Zu dem Thema im allgemeinen sind hier schon einige Beiträge vorhanden, aber ich kann das auf meinen Fall leider nicht anwenden, deshalb hier noch eine Frage und die Bitte auf Hilfe:
Ich habe einen Ordner voller PDF Dateien, in dessen Namen diverse Informationen stecken. Unter anderem ganz am Schluss der erste Teil des Ordnernamens
Beispiel für einen Dateinamen: "DA-2011.01.10-BE-100045487-LI-3301825.pdf"
In dem Fall ist der erste Teil des Ordnernamens zum Kopieren 3301825. Die Position ist aber immer einen andere da der Text hinter BE- unterschiedlich lang sein kann. Der Teilname ist aber immer hinter LI- zu finden (bzw. immer die letzten 7 Zeichen, wobei das nicht so sicher ist).
Im Zielordner sind die entsprechenden Ordner mit zB "3301825 Karl Steiner i" angelegt. Wobei es vorkommen kann, daß Ordner neu angelegt werden oder auch umbenannt werden.
Sollte zu einem Dokument kein Ordner exisiteren soll es entweder stehen bleben oder in einen Unterordner mit der Bezeichnung "Fehler" kopiert werden.
Ich hoffe, daß ich mich verstänlich ausgedrück habe und ersuche um Hilfe.
Danke
Ich habe einen Ordner voller PDF Dateien, in dessen Namen diverse Informationen stecken. Unter anderem ganz am Schluss der erste Teil des Ordnernamens
Beispiel für einen Dateinamen: "DA-2011.01.10-BE-100045487-LI-3301825.pdf"
In dem Fall ist der erste Teil des Ordnernamens zum Kopieren 3301825. Die Position ist aber immer einen andere da der Text hinter BE- unterschiedlich lang sein kann. Der Teilname ist aber immer hinter LI- zu finden (bzw. immer die letzten 7 Zeichen, wobei das nicht so sicher ist).
Im Zielordner sind die entsprechenden Ordner mit zB "3301825 Karl Steiner i" angelegt. Wobei es vorkommen kann, daß Ordner neu angelegt werden oder auch umbenannt werden.
Sollte zu einem Dokument kein Ordner exisiteren soll es entweder stehen bleben oder in einen Unterordner mit der Bezeichnung "Fehler" kopiert werden.
Ich hoffe, daß ich mich verstänlich ausgedrück habe und ersuche um Hilfe.
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 160745
Url: https://administrator.de/forum/dateien-nach-teilstring-aus-dateinamen-kopieren-160745.html
Ausgedruckt am: 21.12.2024 um 13:12 Uhr
32 Kommentare
Neuester Kommentar
Aloha,
der Text hinter BE kann unterschiedlich lang sein, sagst du - wirklich interessant wäre, ob die Anzahl der „Wörter“ bzw. eher Bereiche (zwischen den Bindestrichen) gleichbleibt und ob die Reihenfolge gleichbleibt oder nicht.
(In diesem Fall sind es 6 Bereiche)
So ganz ist mir jetzt momentan aber noch nicht klar, was du wohin kopiert haben willst (nur dass du den Bereich nach LI- kopiert haben willst) aber vielleicht kommt mein Zug auch später.
greetz André
der Text hinter BE kann unterschiedlich lang sein, sagst du - wirklich interessant wäre, ob die Anzahl der „Wörter“ bzw. eher Bereiche (zwischen den Bindestrichen) gleichbleibt und ob die Reihenfolge gleichbleibt oder nicht.
(In diesem Fall sind es 6 Bereiche)
So ganz ist mir jetzt momentan aber noch nicht klar, was du wohin kopiert haben willst (nur dass du den Bereich nach LI- kopiert haben willst) aber vielleicht kommt mein Zug auch später.
greetz André
moin,
demo an der Dosbuxs...
Daraus kannst du gerne was stricken, und falls es wider erwarten trotzdem klemmen sollte - poste einfach, was du alleine hinbekommen hast und wo der Schuh immer noch drückt.
Und wenn du kopieren willst - rate ich dir - schau dir auch mal if /? genauer an - speziell if not exist
Gruß
demo an der Dosbuxs...
for /f "tokens=6 delims=-" %a in ('dir /b laufwerk}pfad\*.pdf') do echo %a
- liefert dir bei dem Beispiel alles nach dem 5 -
for /f "tokens=6 delims=-" %a in ('dir /b laufwerk}pfad\*.pdf') do echo %~na
- liefert dir - wie oben - alles nach dem 5. - aber ohne suffix - also nach deinem Beispiel den Teil, der für den ordner herhalten soll.
Daraus kannst du gerne was stricken, und falls es wider erwarten trotzdem klemmen sollte - poste einfach, was du alleine hinbekommen hast und wo der Schuh immer noch drückt.
Und wenn du kopieren willst - rate ich dir - schau dir auch mal if /? genauer an - speziell if not exist
Gruß
Hallo c4ever!
Wenn Du nur sicher sagen kannst, dass der gesuchte Namensteil alles nach "LI-" darstellt, könntest Du das so angehen:
Das jeweilige "
Grüße
bastla
[Edit] Zielpfad für "
Wenn Du nur sicher sagen kannst, dass der gesuchte Namensteil alles nach "LI-" darstellt, könntest Du das so angehen:
@echo off & setlocal
set "Basis=D:\Ordner voller PDF Dateien"
set "Ziel=D:\Der Zielordner"
pushd "%Basis%"
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do call :ProcessFile "%%i"
pause
goto :eof
:ProcessFile
set "Name=~n1"
set "Ordner=%Name:*LI-=%"
set "Zielordner="
for /f "delims=" %%a in ('dir /b /ad "%Ziel%\%Ordner% *"') do set "Zielordner=%%a"
if defined Zielordner (
echo copy %1 "%Ziel%\%Zielordner%"
) else (
echo move %1 Fehler
)
goto :eof
echo
" vor dem Kopier- bzw Verschiebe-Befehl sorgt dafür, dass Du in Ruhe testen kannst, da so die entpsrechenden Befehle nur angezeigt, aber noch nicht ausgeführt werden - wenn's dann soweit ok aussieht, einfach diese "echo
" entfernen ...Grüße
bastla
[Edit] Zielpfad für "
copy
" komplettiert [/Edit]
Hallo c4ever!
In Zeile 15 wird nach Ordnernamen, die mit dem Teil, der nach "LI-" im Dateinamen steht, und einem Leerzeichen beginnen - anhand Deines Beispieles wäre der Suchstring demzufolge
im Zielpfad gesucht und (falls es mehrere geben sollte, der letzte der Gefundenen) mit vollständigem Namen in die Variable %Zielordner% geschrieben - das kannst Du einfach kontrollieren, indem Du zwischen Zeile 15 und 16 eine Zeile
bzw beser gleich für den vollständigen Pfad (wie er dann ja im "
Dass es den Ordner "Fehler" (für den Fall, dass kein passender Zielordner gefunden wurde) bereits gibt, habe ich vorausgesetzt ...
Grüße
bastla
In Zeile 15 wird nach Ordnernamen, die mit dem Teil, der nach "LI-" im Dateinamen steht, und einem Leerzeichen beginnen - anhand Deines Beispieles wäre der Suchstring demzufolge
"3301825 *"
echo\%Zielordner%
copy
" verwendet wird):echo %Ziel%\%Zielordner%
Grüße
bastla
Zitat von @c4ever:
Hallo Bastla,
ich glaub ich bin zu blöd zum kopieren. Jedenfalls hab ich den Code jetzt so umgeändert:
Hallo Bastla,
ich glaub ich bin zu blöd zum kopieren. Jedenfalls hab ich den Code jetzt so umgeändert:
Mit Verlaub - Bastla hat ein/zwei kleiner Böcke reingebaut, die total unnötig sind.
(Damit ziele ich darauf hin, dass ich dir einen Ansatz zum selberschreiben gegeben habe und Bastla los gelegt hat)
Hättest du das selber geschrieben und wir dir dabei geholfen, wäre es sinniger gewesen.
:@echo off &
setlocal
set "Basis=D:\test\Quelle"
set "Ziel=D:\test\Ziel"
pushd "%Basis%"
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do call :ProcessFile "%%i"
pause
goto :eof
:ProcessFile
echo %1
set "Name=%~n1"
echo %Name%
set "Ordner=%Name:*LI-=%"
echo %Ordner%
set "Zielordner="
for /f "delims=" %%a in ('dir /b /ad "%Ziel%\%Ordner%*"') do set "Zielordner=%%a"
echo %Ziel%\%Zielordner%
if defined Zielordner (
echo copy %Basis%\%1 "%Ziel%\%Zielordner%\"
) else (
echo move %1 Fehler
)
goto :eof
btw: das Ding ist aber so immer noch nicht scharf..... siehe echo copy.
Dieses Echo hat mehrere Sinne - so wie ich die gesetzt habe - hätte das jeder andere (damit meine ich dich) auch machen können und wäre schwuppsdiewupps auf ein fehlendes % und einen fehlenden Pfad gekommen.
@t-mo
Zum Thema "unnötig" fiele mir andererseits Dein "
mag sich mir der Sinn der nochmaligen Angabe des Basispfades nicht so richtig erschließen (und wenn schon, dann zumindest als
Dass Du an einer anderen Stelle dafür wieder gespart hast (nämlich beim Leerzeichen in der Ordnersuche) sollte sich nicht wirklich auswirken - zumindest, wenn tatsächlich die gesuchten Nummern alle die gleiche Stellenanzahl haben, wodurch eine Verwechslung von zB "3301825" und "330182" ausgeschlossen wäre ...
Grüße
bastla
Böcke reingebaut, die total unnötig sind.
Zu meinen Vorsätzen für die nächste Zeit zählt ohnehin die Beschränkung auf nötige Böcke ... Zum Thema "unnötig" fiele mir andererseits Dein "
copy %Basis%\%1
" ein - nach dem (vor langer Zeit erfolgten)pushd "%Basis%"
copy "%Basis%\%~1"
Hättest du das selber geschrieben und wir dir dabei geholfen, wäre es sinniger gewesen.
... allerdings wäre auch ein ganz anderer Batch dabei herausgekommen ... Grüße
bastla
Zitat von @bastla:
@t-mo
> Böcke reingebaut, die total unnötig sind.
Zu meinen Vorsätzen für die nächste Zeit zählt ohnehin die Beschränkung auf nötige Böcke ...
Grüße
bastla
@t-mo
> Böcke reingebaut, die total unnötig sind.
Zu meinen Vorsätzen für die nächste Zeit zählt ohnehin die Beschränkung auf nötige Böcke ...
Grüße
bastla
@bastla:
ich hab doch nur sein gepostetes von dir stammendes Script genommen - ein: als erstes Zeichen und einen zeilenschalter nach dem & gemacht
Und dabei ist der Fehler der letzten Version, die ursprünglich mal von dir stammt in Zeile 13, statt 12 gewesen.
Ich hab nix gelöscht, das war jemand anderes - ich hab würglisch nur was dazugemalt.
Und der Seitenhieb mit dem unnötigen Bock - hey wir beide wissen doch wie es geht, nur lernen die wenigsten anhand fixundfertiger Batche was die genau machen - also dieser Seitenhieb war zu 100% nicht auf dich gemünzt.
Gruß
[OT] @t-mo
No problem - ich halte auch Seitenhiebe aus (ist der Vorteil eines permanent ausgefahrenen "personal airbag")
Grüße
bastla
[/OT]
No problem - ich halte auch Seitenhiebe aus (ist der Vorteil eines permanent ausgefahrenen "personal airbag")
Ich hab nix gelöscht, das war jemand anderes - ich hab würglisch nur was dazugemalt.
Ich hatte nur nochmal über die Letztversion (und die hattest eben Du gepostet) drübergeschaut und dabei waren mir die entsprechenden Kleinigkeiten aufgefallen - aber sorry für die Falschadressierung der Hinweise ...Grüße
bastla
[/OT]
[OT] @bastla
Wenn er doch wochenlang mit seiner Angina im Bett gelegen hat, dann ist es doch besser, wenn er erstmal "pause" macht als wenn er "popd"..
Grüße
Biber
[/OT]
Zitat von @bastla:
Hallo c4ever!
Noch ein Kleinigkeit: Das ohnehin unnötige "
(der Ordnung halber) noch fehlende "
Andererseits....Hallo c4ever!
Noch ein Kleinigkeit: Das ohnehin unnötige "
pause
" in Zeile 8 war wenigstens ein guter Platzhalter für das(der Ordnung halber) noch fehlende "
popd
" - bitte austauschen ...Wenn er doch wochenlang mit seiner Angina im Bett gelegen hat, dann ist es doch besser, wenn er erstmal "pause" macht als wenn er "popd"..
Grüße
Biber
[/OT]
[OT] @Biber
Grüße
bastla
[/OT]
... (3) wochenlang ...
... und das wäre nicht schon genug "pause" gewesen? Grüße
bastla
[/OT]
Zitat von @bastla:
[OT] @Biber
> ... (3) wochenlang ...
... und das wäre nicht schon genug "pause" gewesen?
Grüße
bastla
[/OT]
[OT] @Biber
> ... (3) wochenlang ...
... und das wäre nicht schon genug "pause" gewesen?
Grüße
bastla
[/OT]
[OT]
Wenn er doch wochenlang mit seiner Angina im Bett gelegen hat, dann ist es doch besser, wenn er erstmal "pause" macht als wenn er "popd"..
jajaja ich will popden jaja je
Lieber drei Wochen mit Angelina, als einmal mit Dolly dem Schaaaf
[/OT]
moin,
Gruß
- hast du dir mal meinen Echo off Link angesehen?
- mach das raus
- nimm ne Dosbox
- zieh die Bat/cmd da rein
- mach ein > dahinter
- schieb die batch ein zweites mal in die Dosbox
- ändere die suffix der letzten bat/cmd in ini oder txt
- und schick ein Return hinterher.
- den Inhalt der ini/txt Datei postest du hier in <code type=plain>... </code>
kann ich mit move nur lokal verschieben?
Nein Schreibrechte?Gruß
Hallo c4ever!
Wenn es noch der Originalbatch von oben gewesen wäre, sollte Zeile 22 von
auf
geändert werden (hatte ich übrigens schon vor langer Zeit einmal angemerkt und - zu Unrecht - T-Mo zugeordnet) - allerdings sieht die Zeile
dann doch etwas abgeändert aus - aber auch hier geht es einerseits um Anführungszeichen und zum anderen wird "DA-03.01.2011-BE-10065094-LI-3312074.pdf" einmal ein Pfad vorangestellt, im anderen Fall aber nicht - wegen des vorher bereits erfolgten Wechsels in den Quellordner sollte die pfadlose Variante genügen ...
[Edit] Eigentlich ist ja nur "
[/Edit]
Grüße
bastla
P.S.: Ich habe die von Dir gepostete (und in diesem Kommentar zitierte) Zeile etwas anonymisiert ...
Wenn es noch der Originalbatch von oben gewesen wäre, sollte Zeile 22 von
copy %Basis%\%1 "%Ziel%\%Zielordner%\"
copy "%Basis%\%~1" "%Ziel%\%Zielordner%\"
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>if defined Zielordner (move T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage\"DA-03.01.2011-BE-10065094-LI-3312074.pdf" "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3312074 irgendein Geschaeftspartner i\" ) else (move "DA-03.01.2011-BE-10065094-LI-3312074.pdf" Fehler )
[Edit] Eigentlich ist ja nur "
copy
" durch "move
" ersetzt - dann also:move %1 "%Ziel%\%Zielordner%\"
Grüße
bastla
P.S.: Ich habe die von Dir gepostete (und in diesem Kommentar zitierte) Zeile etwas anonymisiert ...
moin,
Ich vermute, es liegt woanders - ....
Die Zeile kann so nicht erfolgsversprechend laufen.
Wenn diese Zeile noch von der Version kommt, die oben so steht:
Gruß
Ich vermute, es liegt woanders - ....
if defined Zielordner (move DA-2011.01.03-BE-20100161 K-LI-3301235.pdf "U:\GWS Eingangsrechnungen\Eingang
Die Zeile kann so nicht erfolgsversprechend laufen.
Wenn diese Zeile noch von der Version kommt, die oben so steht:
21 if defined Zielordner (
22. echo copy %Basis%\%1 "%Ziel%\%Zielordner%\"
22. echo copy %Basis%\%1 "%Ziel%\%Zielordner%\"
- Dann liegt der mögliche "Bock" in Zeile 1 begraben. Wobei die Zeile schon korrekt ist, aber später zu so - wie Sie benutzt wird - probleme aufwirft.
1. set Basis="T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"
Gruß
@t-mo
Hatten wir eigentlich inzwischen schon durch - abgesehen davon würde ich im Fall des Falles bei
bleiben und die Anführungszeichen dann setzen, wenn sie (für die komplette Angabe der Quelldatei) gebraucht werden, also:
Grüße
bastla
Hatten wir eigentlich inzwischen schon durch - abgesehen davon würde ich im Fall des Falles bei
set "Basis=T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"
move "%Basis%\%~1" "%Ziel%\%Zielordner%\"
bastla
Hallo c4ever!
Nochmals am konkreten Beispiel:
entstanden durch Deine Schreibweise
funktioniert nicht, weil
durch die Leerzeichen vor und nach "Automatische" in 3 Teile "zerfällt".
Gegenmaßnahmen:
Anführungszeichen "außen herum" platzieren - dazu werden sie von "DA-03.01.2011-BE-10065094-LI-3312074.pdf" entfernt (deswegen die Schreibweise mit Tilde):
Basispfad weglassen - dann aber um %1 herum behalten (da ja auch der Dateiname alleine Leerzeichen beinhalten kann - siehe Deinen letzten "Problemfall")
Basispfad und Dateiname getrennt unter Anführungszeichen gesetzt verwenden (das wäre der Vorschlag von T-Mo):
- das würde aufgelöst so aussehen:
und würde auch funktionieren, mag ich aber so nicht verwenden (nicht zuletzt, weil Root als Basispfad, also zB "T:"\"DA-03.01.2011-BE-10065094-LI-3312074.pdf" auf diese Weise gar nicht verarbeitet werden könnte) ...
Grüße
bastla
Nochmals am konkreten Beispiel:
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>if defined Zielordner (move T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage\"DA-03.01.2011-BE-10065094-LI-3312074.pdf" "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3312074 irgendein Geschaeftspartner i\" ) else (move "DA-03.01.2011-BE-10065094-LI-3312074.pdf" Fehler )
move %Basis%\%1 "%Ziel%\%Zielordner%\"
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage\"DA-03.01.2011-BE-10065094-LI-3312074.pdf"
Gegenmaßnahmen:
Anführungszeichen "außen herum" platzieren - dazu werden sie von "DA-03.01.2011-BE-10065094-LI-3312074.pdf" entfernt (deswegen die Schreibweise mit Tilde):
"%Basis%\%~1" "%Ziel%\%Zielordner%\"
move %1 "%Ziel%\%Zielordner%\"
set Basis="T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"
...
move %Basis%\%1 "%Ziel%\%Zielordner%\"
move "T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"\"DA-03.01.2011-BE-10065094-LI-3312074.pdf" "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3312074 irgendein Geschaeftspartner i\"
Grüße
bastla
moin,
@ Bastla - yupp - ich versuchte das ja zu erklären - die erste Zeile ist gut, aber - wie du es besser beschreibst, als ich - der zwischenzeitlich mal weg war - die weitere Verwendung der Variable passt dann nicht.
@4cever
Batch ist dumm wie brot - ist ein pfad oder eine Datei mit einem Leerzeichen involviert - mußt du Batch das mit "" sagen, das es trotzdem nur ein Pfad/Dateiname ist und nicht mehrere.
Und weil ein paar dieses Leerzeichens immer als ein Satz angesehen werden, bringt dir copy
Gruß
edit
lang langsam Rudi Scharping
/edit
@ Bastla - yupp - ich versuchte das ja zu erklären - die erste Zeile ist gut, aber - wie du es besser beschreibst, als ich - der zwischenzeitlich mal weg war - die weitere Verwendung der Variable passt dann nicht.
@4cever
Batch ist dumm wie brot - ist ein pfad oder eine Datei mit einem Leerzeichen involviert - mußt du Batch das mit "" sagen, das es trotzdem nur ein Pfad/Dateiname ist und nicht mehrere.
Und weil ein paar dieses Leerzeichens immer als ein Satz angesehen werden, bringt dir copy
""quelle 1\datei 2""
genausowenig wiecopy quelle 1\datei 2
Und weil das ganze für mich schwer nachvollziehen ist - hab ich den Weg des geringsten Widerstands genommen und in Zeile 1 ein paar dazu geraten.Gruß
edit
lang langsam Rudi Scharping
/edit