c4ever
Goto Top

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

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

Skyemugen
Skyemugen 14.02.2011 um 16:25:25 Uhr
Goto Top
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é
c4ever
c4ever 14.02.2011 um 16:36:33 Uhr
Goto Top
Danke für die rasche Antwort:

Also die Reihenfolge wird gleich bleiben, die Anzahl der "Wörter" (ich geh davon aus, daß der "Zusammenhalt" bei den Zeichen bleiben wird) wird auch gleich bleiben.

Also 6 Bereiche, die man auf 3 Zusammanfassen könnte: "DA-irgendeinDatum-BE-irgendeineBelegNummer-LI-irgendeineLieferantenNummer.pdf"

Ich hab also einen Quell Ordner in dem alle pdf Dateien und der "Fehler" Ordner sind und einen Ziel Ordner in dem zu jedem Lieferanten ein Ordner mit dem Aufbau "irgendeineLieferantenNummer irgendeinName1 irgendeinName2 irgendeinName3" (also variable Länge des Namens, fix ist nur die Länge der Nummer) sein sollte. Wenn nicht, dann soll die Datei entweder im Quell Ordner verbleiben oder in den Fehler Ordner verschoben werden.

Ich hoff, es ist jetzt klarer.
60730
60730 14.02.2011 um 17:01:56 Uhr
Goto Top
moin,

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ß
bastla
bastla 14.02.2011 um 17:26:49 Uhr
Goto Top
Hallo c4ever!

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
Das jeweilige "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]
c4ever
c4ever 15.02.2011 um 09:14:20 Uhr
Goto Top
Hallo Bastla,

funktioniert eigentlich, aber.. der Zielordner wird nicht gefunden. Denn der Teil hinter LI- ist nur der erste Teil des Zielordnernamens.

Und das versteh ich eben nicht: in Zeile 15 deiner Lösung wird der Ordner ja abgefragt oder versteh ich das falsch? OK.. es wird geprüft, ob der Ordner da ist, oder wird da mehr gemacht?

Es müßte auch der vollständige Ordnername ermittelt werden.
Kannst du mir da noch eine Hilfestellung geben?
LG
bastla
bastla 15.02.2011 um 10:38:58 Uhr
Goto Top
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
"3301825 *"
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
echo\%Zielordner%
bzw beser gleich für den vollständigen Pfad (wie er dann ja im "copy" verwendet wird):
echo %Ziel%\%Zielordner%
Dass es den Ordner "Fehler" (für den Fall, dass kein passender Zielordner gefunden wurde) bereits gibt, habe ich vorausgesetzt ...

Grüße
bastla
c4ever
c4ever 15.02.2011 um 15:58:08 Uhr
Goto Top
Hallo Bastla,

ich glaub ich bin zu blöd zum kopieren. Jedenfalls hab ich den Code jetzt so umgeändert:
@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
set "Name=~n1"  
set "Ordner=%Name:*LI-=%"  

set "Zielordner="  
for /f "delims=" %%a in ('dir /b /ad "%Ziel%\%Ordner%*"') do set "Zielordner=%%a"  
    echo %Ziel%\%Zielordner%
if defined Zielordner (
    echo copy %1 "%Ziel%\%Zielordner%"  

) else (
    echo move %1 Fehler
)
goto :eof


ich bekomm aber leider wenn ich das ausführe die Meldung: Datei nicht gefunden, obwohl für jede Datei zumindest in diesem Fall ein Ordner existiert. Der Ordner Fehler ist vorhanden. Auch die Datein sind im Quellordner. Ich versteh das nicht.

LG
60730
60730 15.02.2011 um 16:17:10 Uhr
Goto Top
Zitat von @c4ever:
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.
bastla
bastla 15.02.2011 um 16:46:37 Uhr
Goto Top
@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 ... face-wink

Zum Thema "unnötig" fiele mir andererseits Dein "copy %Basis%\%1" ein - nach dem (vor langer Zeit erfolgten)
pushd "%Basis%"
mag sich mir der Sinn der nochmaligen Angabe des Basispfades nicht so richtig erschließen (und wenn schon, dann zumindest als
copy "%Basis%\%~1"
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 ...
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 ... face-wink

Grüße
bastla
c4ever
c4ever 15.02.2011 um 16:48:59 Uhr
Goto Top
Herzlichen Dank euch beiden.

So klappt das einwandfrei.

Und Timo, du hast recht: der Lerneffekt ist beim Selberschreiben wesentlich größer, leider hab ich beim Batch schrieben noch so gut wie keine Erfahrung, kann mir Variablen und Parametern hier nix anfangen. Und war darüber hinaus 3 Wochen brachliegend zu Haus im Bett weil mich eine simple Grippe erfasst hat. Das brachte mich in Zeitnot.

Das nächste Mal werd ich mich mehr bemühen.

Danke noch mal.
bastla
bastla 15.02.2011 um 16:52:26 Uhr
Goto Top
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 ...

Grüße
bastla
c4ever
c4ever 15.02.2011 um 16:52:27 Uhr
Goto Top
Zitat von @bastla:

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 ...

Danke auch für den Hinweis. Das ist zumindest vorerst fix, aber kann sich auch ändern. Das hätte ich übersehn...

LG
60730
60730 15.02.2011 um 16:52:37 Uhr
Goto Top
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

@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ß
bastla
bastla 15.02.2011 um 16:59:45 Uhr
Goto Top
[OT] @t-mo
No problem - ich halte auch Seitenhiebe aus (ist der Vorteil eines permanent ausgefahrenen "personal airbag") face-wink
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]
Biber
Biber 15.02.2011 um 17:12:40 Uhr
Goto Top
[OT] @bastla
Zitat von @bastla:
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 ...
Andererseits....

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]
bastla
bastla 15.02.2011 um 17:23:28 Uhr
Goto Top
[OT] @Biber
... (3) wochenlang ...
... und das wäre nicht schon genug "pause" gewesen? face-wink

Grüße
bastla
[/OT]
60730
60730 15.02.2011 um 17:30:26 Uhr
Goto Top
Zitat von @bastla:
[OT] @Biber
> ... (3) wochenlang ...
... und das wäre nicht schon genug "pause" gewesen? face-wink

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]
c4ever
c4ever 23.02.2011 um 21:49:12 Uhr
Goto Top
so, jetzt hat sich leider doch noch eine frage aufgetan....

wenn ich das script lokal ablaufen lasse, dann geht alles einwandfrei. also wenn ich sowohl quell als auch zielordner im gleichn verzeichnis hab.

wenn ich jedoch da ein netzlaufwerk verwende (also nicht über UNC) , dann bekomme ich syntaxfehler beim kopieren der datei, nachdem der zielordner festgelegt wurde.

kann ich mit move nur lokal verschieben?

lg
60730
60730 26.02.2011 um 00:40:26 Uhr
Goto Top
moin,

  • 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ß
c4ever
c4ever 27.02.2011 um 20:07:39 Uhr
Goto Top
Hallo Timo,

es sind in dem Fall alle Rechte vorhanden.

Ich hab auch das Gefühl, der Fehler ist offensichtlich, aber ich seh ihn nicht.

LG

N:\>set "Basis=T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage" 

N:\>set "Ziel=U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010" 

N:\>pushd "T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %i in ('dir /b /a-d *.pdf') do call :ProcessFile "%i" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>call :ProcessFile "DA-03.01.2011-BE-10065094-LI-3312074.pdf" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo "DA-03.01.2011-BE-10065094-LI-3312074.pdf" 
"DA-03.01.2011-BE-10065094-LI-3312074.pdf"

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Name=DA-03.01.2011-BE-10065094-LI-3312074" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo DA-03.01.2011-BE-10065094-LI-3312074 
DA-03.01.2011-BE-10065094-LI-3312074

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Ordner=3312074" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo 3312074 
3312074

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %a in ('dir /b /ad "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3312074*"') do set "Zielordner=%a" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=3312074 REED MESSE SALZBURG GmbH i" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3312074 REED MESSE SALZBURG GmbH i 
U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3312074 REED MESSE SALZBURG GmbH i

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 REED MESSE SALZBURG GmbH i\" )  else (move "DA-03.01.2011-BE-10065094-LI-3312074.pdf" Fehler ) 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>goto :eof 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>call :ProcessFile "DA-03.01.2011-BE-RE102715-LI-3309023.pdf" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo "DA-03.01.2011-BE-RE102715-LI-3309023.pdf" 
"DA-03.01.2011-BE-RE102715-LI-3309023.pdf"

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Name=DA-03.01.2011-BE-RE102715-LI-3309023" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo DA-03.01.2011-BE-RE102715-LI-3309023 
DA-03.01.2011-BE-RE102715-LI-3309023

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Ordner=3309023" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo 3309023 
3309023

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %a in ('dir /b /ad "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3309023*"') do set "Zielordner=%a" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=3309023 Computer Center i" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3309023 Computer Center i 
U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3309023 Computer Center i

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>if defined Zielordner (move T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage\"DA-03.01.2011-BE-RE102715-LI-3309023.pdf" "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3309023 Computer Center i\" )  else (move "DA-03.01.2011-BE-RE102715-LI-3309023.pdf" Fehler ) 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>goto :eof 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>call :ProcessFile "DA-13.01.2011-BE-169762-LI-3300946.pdf" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo "DA-13.01.2011-BE-169762-LI-3300946.pdf" 
"DA-13.01.2011-BE-169762-LI-3300946.pdf"

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Name=DA-13.01.2011-BE-169762-LI-3300946" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo DA-13.01.2011-BE-169762-LI-3300946 
DA-13.01.2011-BE-169762-LI-3300946

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Ordner=3300946" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo 3300946 
3300946

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %a in ('dir /b /ad "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3300946*"') do set "Zielordner=%a" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=3300946 STIEGL GETRŽNKE & SERVICE GMBH & CO.KG i" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3300946 STIEGL GETRŽNKE   & SERVICE GMBH   & CO.KG i 
U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3300946 STIEGL GETRŽNKE 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>if defined Zielordner (move T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage\"DA-13.01.2011-BE-169762-LI-3300946.pdf" "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3300946 STIEGL GETRŽNKE & SERVICE GMBH & CO.KG i\" )  else (move "DA-13.01.2011-BE-169762-LI-3300946.pdf" Fehler ) 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>goto :eof 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>call :ProcessFile "DA-13.01.2011-BE-AR111163-LI-3300443.pdf" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo "DA-13.01.2011-BE-AR111163-LI-3300443.pdf" 
"DA-13.01.2011-BE-AR111163-LI-3300443.pdf"

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Name=DA-13.01.2011-BE-AR111163-LI-3300443" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo DA-13.01.2011-BE-AR111163-LI-3300443 
DA-13.01.2011-BE-AR111163-LI-3300443

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Ordner=3300443" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo 3300443 
3300443

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %a in ('dir /b /ad "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\3300443*"') do set "Zielordner=%a" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\ 
U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>if defined Zielordner (move T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage\"DA-13.01.2011-BE-AR111163-LI-3300443.pdf" "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2010\\" )  else (move "DA-13.01.2011-BE-AR111163-LI-3300443.pdf" Fehler ) 
        1 Datei(en) verschoben.

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>goto :eof 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>popd

N:\>goto :eof  
bastla
bastla 27.02.2011, aktualisiert am 18.10.2012 um 18:46:00 Uhr
Goto Top
Hallo c4ever!

Wenn es noch der Originalbatch von oben gewesen wäre, sollte Zeile 22 von
copy %Basis%\%1 "%Ziel%\%Zielordner%\"
auf
copy "%Basis%\%~1" "%Ziel%\%Zielordner%\"
geändert werden (hatte ich übrigens schon vor langer Zeit einmal angemerkt und - zu Unrecht - T-Mo zugeordnet) - allerdings sieht die Zeile
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 )
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 "copy" durch "move" ersetzt - dann also:
move %1 "%Ziel%\%Zielordner%\"
[/Edit]

Grüße
bastla

P.S.: Ich habe die von Dir gepostete (und in diesem Kommentar zitierte) Zeile etwas anonymisiert ...
c4ever
c4ever 27.02.2011 um 20:29:28 Uhr
Goto Top
Hallo Bastla,

so sieht mein bat file momentan aus:

set "Basis=T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"  
set "Ziel=U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011"  

pushd "%Basis%"  
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do call :ProcessFile "%%i"  
popd
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 (
    move %Basis%\%~1 "%Ziel%\%Zielordner%\"  

) else (
    move %1 Fehler
)
goto :eof
 

Hab es nochmal mit einer Datei probiert und folgendes Ergebnis erhalten, aber es wurde nix verschoben.

N:\>set "Basis=T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage" 

N:\>set "Ziel=U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011" 

N:\>pushd "T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %i in ('dir /b /a-d *.pdf') do call :ProcessFile "%i" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>call :ProcessFile "DA-03.01.2011-BE-10065094-LI-3312074.pdf" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo "DA-03.01.2011-BE-10065094-LI-3312074.pdf" 
"DA-03.01.2011-BE-10065094-LI-3312074.pdf"

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Name=DA-03.01.2011-BE-10065094-LI-3312074" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo DA-03.01.2011-BE-10065094-LI-3312074 
DA-03.01.2011-BE-10065094-LI-3312074

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Ordner=3312074" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo 3312074 
3312074

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %a in ('dir /b /ad "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3312074*"') do set "Zielordner=%a" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=3312074 REED MESSE SALZBURG GmbH i" 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3312074 REED MESSE SALZBURG GmbH i 
U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3312074 REED MESSE SALZBURG GmbH i

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 2011\3312074 REED MESSE SALZBURG GmbH i\" )  else (move "DA-03.01.2011-BE-10065094-LI-3312074.pdf" Fehler ) 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>goto :eof 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>popd

N:\>goto :eof 

 

Gruß
c4ever
bastla
bastla 27.02.2011 um 20:33:23 Uhr
Goto Top
Hallo c4ever!

Du solltest ja auch entweder Anführungszeichen verwenden oder, besser, auf %Basis% verzichten ...

Grüße
bastla

P.S.: Beim Posten von mehreren Codezeilen ist es sinnvoller, nicht mit type="plain" zu formatieren - dann gibt es Zeilennummern, auf die man/frau sich beziehen kann ...
c4ever
c4ever 27.02.2011 um 21:18:26 Uhr
Goto Top
Danke,
hab das mit type=plain geändert und in Zeile 20 %Basis% entfernt.

Soweit funktioniert das verschieben jetzt. Hab nur mehr mit einer Datei ein Problem, aber ich denk das liegt am Dateinamen, kann das sein? Ich seh aber keinen so offensichtlichen Fehler, aber die Verschiebung erfolgt nicht, auch nicht in den Fehler-Ordner.

N:\>set "Basis=T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"   

N:\>set "Ziel=U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011"   

N:\>pushd "T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %i in ('dir /b /a-d *.pdf') do call :ProcessFile "%i"   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>call :ProcessFile "DA-2011.01.03-BE-20100161 K-LI-3301235.pdf"   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo "DA-2011.01.03-BE-20100161 K-LI-3301235.pdf"   
"DA-2011.01.03-BE-20100161 K-LI-3301235.pdf"  

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Name=DA-2011.01.03-BE-20100161 K-LI-3301235"   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo DA-2011.01.03-BE-20100161 K-LI-3301235 
DA-2011.01.03-BE-20100161 K-LI-3301235

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Ordner=3301235"   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo 3301235 
3301235

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner="   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %a in ('dir /b /ad "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3301235*"') do set "Zielordner=%a"   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=3301235 NIMO Stick-Design i"   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3301235 NIMO Stick-Design i 
U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3301235 NIMO Stick-Design i

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>if defined Zielordner (move DA-2011.01.03-BE-20100161 K-LI-3301235.pdf "U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3301235 NIMO Stick-Design i\" )  else (move "DA-2011.01.03-BE-20100161 K-LI-3301235.pdf" Fehler )   

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>goto :eof 

T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>popd

N:\>goto :eof 

LG
bastla
bastla 27.02.2011 um 21:25:40 Uhr
Goto Top
Hallo c4ever!

Und Du bist Dir sicher, dass Du genau die empfohlene Schreibweise
move %1 "%Ziel%\%Zielordner%\"
verwendet hast?

Grüße
bastla
c4ever
c4ever 27.02.2011 um 21:36:11 Uhr
Goto Top
Hallo Bastla,

hab das jetzt geändert, hab es vorhin auf

move %~1 "%Ziel%\%Zielordner%\"  

geändert.

Mit
move %1 "%Ziel%\%Zielordner%\"  

funktioniert es einwandfrei.

Blöde Frage, aber wo genau liegt der Unterschied? Was bewirkt die Tilde?

LG
60730
60730 27.02.2011 um 21:51:49 Uhr
Goto Top
moin,

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%\"
  • 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ß
bastla
bastla 27.02.2011 um 21:53:33 Uhr
Goto Top
Hallo c4ever!
Blöde Frage, aber wo genau liegt der Unterschied? Was bewirkt die Tilde?
Dadurch werden die umschließenden Anführungszeichen entfernt, was dann eben dazu führt, dass der Name durch die enthaltenen Leerzeichen "zerrissen" wird.

Grüße
bastla
bastla
bastla 27.02.2011 um 21:56:16 Uhr
Goto Top
@t-mo
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"
bleiben und die Anführungszeichen dann setzen, wenn sie (für die komplette Angabe der Quelldatei) gebraucht werden, also:
move "%Basis%\%~1" "%Ziel%\%Zielordner%\"
Grüße
bastla
c4ever
c4ever 27.02.2011 um 22:00:56 Uhr
Goto Top
Servus Timo,

jetzt bin ich verwirrt.

Das Skript funkioniert jetzt, sofern ich %Basis% aus dem Skript entferne. Aber warum funktioniert es nicht, wenn ich das drin lasse?

Aus meiner Sicht ist da weder was zu viel, noch zu wenig. Nur finde ich die Anführungszeichen beim move Befehl eigenartig, die ich oben angeführt habe. Liegt es daran?

LG
bastla
bastla 27.02.2011 um 22:15:24 Uhr
Goto Top
Hallo c4ever!

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 )
entstanden durch Deine Schreibweise
move %Basis%\%1 "%Ziel%\%Zielordner%\"
funktioniert nicht, weil
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage\"DA-03.01.2011-BE-10065094-LI-3312074.pdf"
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):
"%Basis%\%~1" "%Ziel%\%Zielordner%\"
Basispfad weglassen - dann aber um %1 herum behalten (da ja auch der Dateiname alleine Leerzeichen beinhalten kann - siehe Deinen letzten "Problemfall")
move %1 "%Ziel%\%Zielordner%\"
Basispfad und Dateiname getrennt unter Anführungszeichen gesetzt verwenden (das wäre der Vorschlag von T-Mo):
set Basis="T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"
...
move %Basis%\%1 "%Ziel%\%Zielordner%\"
- das würde aufgelöst so aussehen:
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\"
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
60730
60730 27.02.2011 um 22:19:00 Uhr
Goto Top
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
""quelle 1\datei 2""
genausowenig wie
copy 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