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

Dateien nach Teilstring aus Dateinamen kopieren

Frage Entwicklung Batch & Shell

Mitglied: c4ever

c4ever (Level 1) - Jetzt verbinden

14.02.2011, aktualisiert 18.10.2012, 5405 Aufrufe, 32 Kommentare

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
32 Antworten
Mitglied: Skyemugen
14.02.2011 um 16:25 Uhr
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é
Bitte warten ..
Mitglied: c4ever
14.02.2011 um 16:36 Uhr
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.
Bitte warten ..
Mitglied: 60730
14.02.2011 um 17:01 Uhr
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ß
Bitte warten ..
Mitglied: bastla
14.02.2011 um 17:26 Uhr
Hallo c4ever!

Wenn Du nur sicher sagen kannst, dass der gesuchte Namensteil alles nach "LI-" darstellt, könntest Du das so angehen:
01.
@echo off & setlocal 
02.
set "Basis=D:\Ordner voller PDF Dateien" 
03.
set "Ziel=D:\Der Zielordner" 
04.
 
05.
pushd "%Basis%" 
06.
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do call :ProcessFile "%%i" 
07.
pause 
08.
goto :eof 
09.
 
10.
:ProcessFile 
11.
set "Name=~n1" 
12.
set "Ordner=%Name:*LI-=%" 
13.
 
14.
set "Zielordner=" 
15.
for /f "delims=" %%a in ('dir /b /ad "%Ziel%\%Ordner% *"') do set "Zielordner=%%a" 
16.
if defined Zielordner ( 
17.
    echo copy %1 "%Ziel%\%Zielordner%" 
18.
) else ( 
19.
    echo move %1 Fehler 
20.
21.
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]
Bitte warten ..
Mitglied: c4ever
15.02.2011 um 09:14 Uhr
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
Bitte warten ..
Mitglied: bastla
15.02.2011 um 10:38 Uhr
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
Bitte warten ..
Mitglied: c4ever
15.02.2011 um 15:58 Uhr
Hallo Bastla,

ich glaub ich bin zu blöd zum kopieren. Jedenfalls hab ich den Code jetzt so umgeändert:
01.
@echo off & setlocal 
02.
set "Basis=D:\test\Quelle" 
03.
set "Ziel=D:\test\Ziel" 
04.
 
05.
pushd "%Basis%" 
06.
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do call :ProcessFile "%%i" 
07.
pause 
08.
goto :eof 
09.
 
10.
:ProcessFile 
11.
set "Name=~n1" 
12.
set "Ordner=%Name:*LI-=%" 
13.
 
14.
set "Zielordner=" 
15.
for /f "delims=" %%a in ('dir /b /ad "%Ziel%\%Ordner%*"') do set "Zielordner=%%a" 
16.
    echo %Ziel%\%Zielordner% 
17.
if defined Zielordner ( 
18.
    echo copy %1 "%Ziel%\%Zielordner%" 
19.
 
20.
) else ( 
21.
    echo move %1 Fehler 
22.
23.
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
Bitte warten ..
Mitglied: 60730
15.02.2011 um 16:17 Uhr
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.


01.
:@echo off & 
02.
 setlocal 
03.
set "Basis=D:\test\Quelle" 
04.
set "Ziel=D:\test\Ziel" 
05.
 
06.
pushd "%Basis%" 
07.
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do call :ProcessFile "%%i" 
08.
pause 
09.
goto :eof 
10.
 
11.
:ProcessFile 
12.
echo %1 
13.
set "Name=%~n1" 
14.
echo %Name% 
15.
set "Ordner=%Name:*LI-=%" 
16.
echo %Ordner% 
17.
 
18.
set "Zielordner=" 
19.
for /f "delims=" %%a in ('dir /b /ad "%Ziel%\%Ordner%*"') do set "Zielordner=%%a" 
20.
    echo %Ziel%\%Zielordner% 
21.
if defined Zielordner ( 
22.
    echo copy %Basis%\%1 "%Ziel%\%Zielordner%\" 
23.
 
24.
) else ( 
25.
    echo move %1 Fehler 
26.
27.
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.
Bitte warten ..
Mitglied: bastla
15.02.2011 um 16:46 Uhr
@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 ...

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

Grüße
bastla
Bitte warten ..
Mitglied: c4ever
15.02.2011 um 16:48 Uhr
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.
Bitte warten ..
Mitglied: bastla
15.02.2011 um 16:52 Uhr
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
Bitte warten ..
Mitglied: c4ever
15.02.2011 um 16:52 Uhr
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
Bitte warten ..
Mitglied: 60730
15.02.2011 um 16:52 Uhr
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ß
Bitte warten ..
Mitglied: bastla
15.02.2011 um 16:59 Uhr
[OT] @T-Mo
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]
Bitte warten ..
Mitglied: Biber
15.02.2011 um 17:12 Uhr
[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]
Bitte warten ..
Mitglied: bastla
15.02.2011 um 17:23 Uhr
[OT] @Biber
... (3) wochenlang ...
... und das wäre nicht schon genug "pause" gewesen?

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: 60730
15.02.2011 um 17:30 Uhr
Zitat von bastla:
[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]
Bitte warten ..
Mitglied: c4ever
23.02.2011 um 21:49 Uhr
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
Bitte warten ..
Mitglied: 60730
26.02.2011 um 00:40 Uhr
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ß
Bitte warten ..
Mitglied: c4ever
27.02.2011 um 20:07 Uhr
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  
Bitte warten ..
Mitglied: bastla
27.02.2011, aktualisiert 18.10.2012
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 ...
Bitte warten ..
Mitglied: c4ever
27.02.2011 um 20:29 Uhr
Hallo Bastla,

so sieht mein bat file momentan aus:

01.
set "Basis=T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage" 
02.
set "Ziel=U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011" 
03.
 
04.
pushd "%Basis%" 
05.
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do call :ProcessFile "%%i" 
06.
popd 
07.
goto :eof 
08.
 
09.
:ProcessFile 
10.
echo %1 
11.
set "Name=%~n1" 
12.
echo %Name% 
13.
set "Ordner=%Name:*LI-=%" 
14.
echo %Ordner% 
15.
 
16.
set "Zielordner=" 
17.
for /f "delims=" %%a in ('dir /b /ad "%Ziel%\%Ordner%*"') do set "Zielordner=%%a" 
18.
    echo %Ziel%\%Zielordner% 
19.
if defined Zielordner ( 
20.
    move %Basis%\%~1 "%Ziel%\%Zielordner%\" 
21.
 
22.
) else ( 
23.
    move %1 Fehler 
24.
25.
goto :eof 
26.
 
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
Bitte warten ..
Mitglied: bastla
27.02.2011 um 20:33 Uhr
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 ...
Bitte warten ..
Mitglied: c4ever
27.02.2011 um 21:18 Uhr
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.

01.
 
02.
N:\>set "Basis=T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"  
03.
 
04.
N:\>set "Ziel=U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011"  
05.
 
06.
N:\>pushd "T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage"  
07.
 
08.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>for /F "delims=" %i in ('dir /b /a-d *.pdf') do call :ProcessFile "%i"  
09.
 
10.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>call :ProcessFile "DA-2011.01.03-BE-20100161 K-LI-3301235.pdf"  
11.
 
12.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo "DA-2011.01.03-BE-20100161 K-LI-3301235.pdf"  
13.
"DA-2011.01.03-BE-20100161 K-LI-3301235.pdf" 
14.
 
15.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Name=DA-2011.01.03-BE-20100161 K-LI-3301235"  
16.
 
17.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo DA-2011.01.03-BE-20100161 K-LI-3301235  
18.
DA-2011.01.03-BE-20100161 K-LI-3301235 
19.
 
20.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Ordner=3301235"  
21.
 
22.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo 3301235  
23.
3301235 
24.
 
25.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner="  
26.
 
27.
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"  
28.
 
29.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>set "Zielordner=3301235 NIMO Stick-Design i"  
30.
 
31.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>echo U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3301235 NIMO Stick-Design i  
32.
U:\GWS Eingangsrechnungen\Eingangsrechnungen 2011\3301235 NIMO Stick-Design i 
33.
 
34.
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 )  
35.
 
36.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>goto :eof  
37.
 
38.
T:\Buchhaltung\Scan_Rechnungen\Test Automatische Ablage>popd 
39.
 
40.
N:\>goto :eof  
41.
 
LG
Bitte warten ..
Mitglied: bastla
27.02.2011 um 21:25 Uhr
Hallo c4ever!

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

Grüße
bastla
Bitte warten ..
Mitglied: c4ever
27.02.2011 um 21:36 Uhr
Hallo Bastla,

hab das jetzt geändert, hab es vorhin auf

01.
move %~1 "%Ziel%\%Zielordner%\"
geändert.

Mit
01.
move %1 "%Ziel%\%Zielordner%\"
funktioniert es einwandfrei.

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

LG
Bitte warten ..
Mitglied: 60730
27.02.2011 um 21:51 Uhr
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ß
Bitte warten ..
Mitglied: bastla
27.02.2011 um 21:53 Uhr
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
Bitte warten ..
Mitglied: bastla
27.02.2011 um 21:56 Uhr
@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
Bitte warten ..
Mitglied: c4ever
27.02.2011 um 22:00 Uhr
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
Bitte warten ..
Mitglied: bastla
27.02.2011 um 22:15 Uhr
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
Bitte warten ..
Mitglied: 60730
27.02.2011 um 22:19 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Batch & Shell
gelöst Ordner anhand von Dateinamen erstellen und Dateien in Ordner kopieren (3)

Frage von getmoving zum Thema Batch & Shell ...

Batch & Shell
Dateien trotz Verwendung kopieren (2)

Frage von 112Timo zum Thema Batch & Shell ...

Batch & Shell
Dateien kopieren die nicht mehr verändert werden? (10)

Frage von pbelcl zum Thema Batch & Shell ...

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