thomasw
Goto Top

Per Batch Datei umbennen und kopieren mit Angaben aus gleichnamiger CSV

Hallo,

ich habe ein Problem und weiß nicht so recht wie ich es per Batch lösen kann.

Eine Software erstellt mir eine PDF Datei mit folgenden Muster AA_12345678.pdf und dazu eine CSV AA_12345678.csv
In der CSV sind einige Spalten mit Angaben zum Inhalt der PDF.

Nun möchte ich anhand dieser Angaben die PDF umbennen und wegkopieren. Damit die PDF besser wieder auffindbar ist und in der richtigen Abteilung bearbeitet wird.

Aufbau der CSV:

Spalte 1 - 5 sind egal
Spalte 6 und 7 soll an den PDF Dateinamen angehangt werden
Spalte 8 - 14 sind auch egal
Spalte 19 soll als Unterordner sein

Anmerkung: In der CSV sind die Spalten mit einen ; getrennt und der Text steht selber auch in Anführungszeichen "

Speicherpfad der PDF: c:\Dokumente\Spalte 19\AA_12345678_Spalte 6,Spalte7.pdf

Im Anschluss soll die Ursprungs PDF und CSV gelöscht werden.

Das Script würde ich dann per Aufgabenplaner jede Minute druchlaufen lassen. Da im Schnitt jede Minute eine PDF und CSV erstellt wird.

Hoffe das mir jemand helfen kann.

Content-Key: 352523

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

Ausgedruckt am: 19.03.2024 um 05:03 Uhr

Mitglied: rubberman
rubberman 22.10.2017 um 15:09:54 Uhr
Goto Top
Zitat von @ThomasW:

Aufbau der CSV:

Bisschen genauer bitte. Sind die Daten direkt in der ersten Zeile zu finden, oder gibt es eine Kopfzeile? Gibt es leere Datenfelder (aufeinanderfolgende Semikolons ohne Inhalt dazwischen)?

Steffen
Mitglied: ThomasW
ThomasW 22.10.2017 um 15:19:52 Uhr
Goto Top
Hier mal eine gekürze Fassung der CSV:

"219";"6293658";"12";"3";"HC";"Testmann";"theo";"Str";"";"";"";"";"";"";"";"";"";"";"Ordnername";"";"";"";""

Die CSV beseht nur aus einer Zeile ohne Kopfzeile.

Ich habe schon etwas versucht und hinbekommen das die PDF umbenannt wird. Allerdings komme ich nich nicht klar mit den Anführungsstrichen in der CSV sowie den Speicherort.

Hier mal men Versuch, hoffe das hilft etwas:

for /f "delims=" %i in ('dir /b /a-d *.csv') do if exist "%~ni.pdf" ( for /f "usebackq tokens=6,7 delims=;" %a in ("%i") do ren %~ni.pdf %a-%b.pdf )  
Mitglied: ThomasW
ThomasW 22.10.2017 aktualisiert um 15:34:28 Uhr
Goto Top
Habe den Code jetzt nochmal angepasst und klappt per Batch schonmal.

Jetzt habe ich nur noch das Problem das die Datei woanders hin kopiert werden soll.

for /f "delims=" %%i in ('dir /b /a-d *.csv') do if exist "%%~ni.pdf" ( for /f "usebackq tokens=6,7 delims=;" %%a in ("%%i") do ren %%~ni.pdf "%%~ni_%%a_%%b.pdf" )  
Mitglied: rubberman
Lösung rubberman 22.10.2017 aktualisiert um 15:37:34 Uhr
Goto Top
Probiers mal so:
@echo off &setlocal
REM Weil das Arbeitsverzeichnis bei einem geplanten Task ggf. System32 ist ...
cd /d "%~dp0"  

for /f "delims=" %%i in ('dir /b /a-d *.csv') do if exist "%%~ni.pdf" (  
  REM prüfe wie lange es dauern kann, bis die beiden Dateien vollständig geschrieben wurden und passe ggf. an:
  >nul timeout /t 5 /nobreak
  for /f "usebackq tokens=6,7,19 delims=;" %%j in ("%%~i") do (  
    if not exist "C:\Dokumente\%%~l\" md "C:\Dokumente\%%~l"  
    >nul move "%%~ni.pdf" "C:\Dokumente\%%~l\%%~ni_%%~j_%%~k.pdf"  
    del /f "%%~i"  
  )
)
Steffen
Mitglied: ThomasW
ThomasW 24.10.2017 um 15:37:21 Uhr
Goto Top
Ich danke dir.

Habe den Tag selber noch etwas probiert und habe es auf folgenden Weg gelöst.
Nicht wunder, habe es inzwischen ergänzt mit weiteren Variablen.

for /f "delims=" %%i in ('dir /b /a-d *.csv') do if exist "%%~ni.pdf" ( for /f "usebackq tokens=5,6,7,10,19 delims=;" %%a in ("%%i") do ren %%~ni.pdf "%%d_%%b_%%c_%%a_%%~ni.pdf" && move  %%d_%%b_%%c_%%a_%%~ni.pdf \\192.168.4.50\ipad\%%e\ && del %%i )  

Dein Code war aber schon hilfreich, habe aber mit Absicht die Codezeile für den Ordner anlegen nicht übernommen. Da nur bestimmte Dokumente verteilt werden und der Rest soll in den Ordner bleiben.

Aktuell muss ich das ganze nochmal erweiteren, es soll der Token 10 (Variable d) auf 25 Zeichen abgeschnitten werden.
Mitglied: rubberman
Lösung rubberman 24.10.2017 um 19:03:02 Uhr
Goto Top
Nicht so trivial in Batch (in Powershell vermutlich einfacher). Um Clashes mit Ausrufezeichen zu vermeiden musst du (bei ausgeschalteter verzögerter Variablenerweiterung) alle FOR-Variablenwerte normalen Umgebungsvariablen zuweisen, dann die verzögerte Erweiterung einschalten, mit den in Ausrufezeichen eingefassten Umgebungsvariablen arbeiten (!var:~0,10! für die ersten 10 Zeichen von Variable var) und anschließend die verzögerte Erweiterung wieder ausknipsen. Das in einer unleserlichen Zeile abzufackeln, ist etwas suboptimal.

Steffen
Mitglied: ThomasW
ThomasW 25.10.2017 um 07:24:47 Uhr
Goto Top
Danke. Dann weiß ich wo der Fehler lag. Ich habe nur die eine benötigte FOR-Variable als normale Umgebungsvariable zugewiesen.
Dann passe ich nochmal an.

Danke dir. Der Code wird wieder in mehreren Zeilen leserlich sich.
Durch das ganze kopieren und probieren hatte ich den zum Schluß in einer langen Zeile gehabt.

Inzwischen habe ich die einzelnen Schritte auch dokumentiert.

Thomas