don.redhorse
Goto Top

String aus PDF Datei als Dateinamenszusatz für eben diese PDF Datei

Bastle schon einige Zeit an einer Batch rum mit der ich mir einiges an Handarbeit ersparen will.

Zu Verarbeiten sind PDF Dateien die per Mail kommen. Die Dateien werden per Extraktor in einen Ordner kopiert. Der Dateiname ist immer:

"PO Bestellung 145123456 vom tt.mm.jjjj.pdf"

Die PDF wird per pdftotxt in Text umgewandelt.
In der PDF Datei steht eine Nummer die vor dem Dateinamen gesetzt werden müsste:

"40123456-xxx0" (x =0-9)

Das Ergebnis soll also so aussehen:

"40123456-xxx0 PO Bestellung 145123456 vom tt.mm.jjjj.pdf"

In dem Ordner liegen 1-xx Dateien.

Ich bin damit mal angefangen, sieht sicher nicht schön aus, aber für eine Datei funktioniert es. Liegen mehrere Dateien im Ordner wird nur eine Datei umbenannt (ist klar das das so nicht geht).

Kann man das geschreibsel brauchen, oder muss ein ganz neuer Ansatz her.

rem StartPfad ohne abschließenden \ angeben! 

set "Quellverzeichnis=C:\script\pdf2txt"  
set "Quelldatei=*.pdf"  
set "Pufferverzeichnis=C:\script\pdf2txt\buffer"  
set "sFullname=C:\script\pdf2txt\*pdf"   
set "SuchString=Auftragsnummer:"  

for %%i in ("%sFullname%") do set sFILE=%%~ni%%~xi  

for %%i in (%Quellverzeichnis%\%Quelldatei%) do (C:\script\pdf2txt\pdftotext.exe -layout "%%i"   
findstr  "%SuchString%" "%Quellverzeichnis%\%%~ni.txt">%Pufferverzeichnis%\info.log  
)

for /f "Tokens=2,4" %%a in (%Pufferverzeichnis%\info.log) do ren "%Quellverzeichnis%\*.pdf" "%%a-%%b-%sFILE%"  

Ein Auszug aus der PDF:
0010                blablaba1 blablaba2 blablaba3      1,000  ST                                                              xxxx,xx        EUR          1ST  
        Auftragsnummer: 40123456 / 0020

Zum zweiten Teil.

der Teil "blablaba1 blablaba2 blablaba3" müsste auch noch mit in den Dateinamen, sollte dann so aussehen:

"40123456-0020 blablaba1 blablaba2 blablaba3 PO Bestellung 145123456 vom tt.mm.jjjj.pdf"

0010" "blablaba1 blablaba2 blablaba3" "1,00 etc.
Trennzeichen wären also nur mehr als ein Leerzeichen, "blablaba1 blablaba2 blablaba3 " kann ein Text von ein paar Buchstaben bis wenige Worte sein, also leider nicht fest zu beziffern.
Ist das so möglich? Ich komme auf jeden Fall nicht mehr wirklich weiter.

Danke im Voraus

Content-ID: 166065

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

Ausgedruckt am: 22.11.2024 um 08:11 Uhr

60730
60730 11.05.2011 um 15:26:43 Uhr
Goto Top
moin und willkommen im Club,

ich verstehe deinen Ansatz nur halb...

zeilen 3-6 sind irgendwie doppelmoppel?
Zeile 9 überflüssig?

Die Schleife um Zeile 12 wird solange abgeabrbeitet, wie pdffe gefunden werden und dann wird die letzte und nur die umbenamst?
Dann hast du keine Abfrage, ob es zu einer PDF bereits eine Txt gibt - da du die umbenamst "so" auch eher fragwürdig.
Also solltest du nur die pdffe anzapfen, die du nicht bereits mit Namensmuster versehen hast.

Und das du leerzeichen im Dateinamen haben willst - kann ich nicht verstehen, ich bin aber schon älter und versteh immer weniger

Danke im Voraus

Bitte - du bist neu und daher verzeihe ich dir beide Böcke - den Grußlosen und das vorausdanke

Beides mag ich und ein paar andere nicht.

Gruß
Skyemugen
Skyemugen 11.05.2011 um 16:23:51 Uhr
Goto Top
Aloha,

ich denke, den ersten Teil wirst du selber hinbekommen (dafür gibt es ja reichlich Anschauungsmaterial im Forum), zum zweiten Teil könnte ich dir eine Möglichkeit anbieten:
@echo off & setlocal enabledelayedexpansion
for /f "tokens=1,2* delims=," %%i in ('type %temp%\bla.txt ^|findstr "ST"') do set "var=%%i"  
set "var=!var:~20,-7!"  
echo !var!
pause
goto :eof

Nur ein kleines Testschnipselchen, das eventuell umständlich ist aber passen sollte.
Da du .txt aus den PDF erzeugst, ist es natürlich sinnvoll dann auch die Information aus der .txt auszulesen.

greetz André

P.S.: Sollte sich die Stückzahl mehrstelligen schönes Wort *gg*, kann es je nach Formatierung sein, dass var dann noch ein paar Leerzeichen enthält ...
edit gut mit ein wenig if lässt sich auch noch das Letztere eindeutig setzen ^_^

P.P.S.: Das enabledelayedexpansion ist diesbezüglich eigentlich kein muss, da es auch mit set "var=%var:~20,-7%" und diesbezüglich echo %var% funktioniert aber irgendwie habe ich so das Gefühl, dass man hier in der Gesamtheit am Ende sowieso die Erweiterung benötigen wird.
don.redhorse
don.redhorse 11.05.2011 um 16:56:26 Uhr
Goto Top
Zitat von @60730:
moin und willkommen im Club,

jau, Moin, als Oldenburger in NRW hört man das selten und Danke!

ich verstehe deinen Ansatz nur halb...

zeilen 3-6 sind irgendwie doppelmoppel?

Sagen wir es mal so, das ganze ist gewachsen, Zeile 06 ist reingekommen um den Namen der Datei in eine Variable zu schreiben. Alleine da ist ja schon der Haken das das nur mit einer Datei funktioniert.

Zeile 9 überflüssig?

ist für den bestehenden Dateinamen, passt nicht zu dem set, ich weiss, deshalb habe ich dabei auch aufgegeben.

Die Schleife um Zeile 12 wird solange abgeabrbeitet, wie pdffe gefunden werden und dann wird die letzte und nur
die
umbenamst?

Die Schleife stammt aus dem Versuch das ganze für eine Datei tauglich zu machen. Dabei bin ich dann auf einen älteren Beitrag hier gestossen der ein ähnliches Problem behandelt und habe den Code von dort übernommen (Variablen und so). Mein erstes Konstrukt sah noch viel schlimmer aus (kaum zu glauben).

Dann hast du keine Abfrage, ob es zu einer PDF bereits eine Txt gibt - da du die umbenamst "so" auch eher
fragwürdig.
Also solltest du nur die pdffe anzapfen, die du nicht bereits mit Namensmuster versehen hast.

Genau deshalb der Hilferuf. Mag ja sein das ich das noch hinbekomme, aber meine Kenntnisse zu Batch Dateien liegen ersten nen paaaar Jahre zurück und haben sich auch nie soweit erstreckt.

Und das du leerzeichen im Dateinamen haben willst - kann ich nicht verstehen, ich bin aber schon älter und versteh immer
weniger


Die Leerzeichen sind drin im Namen der PDF, müssten also erst entfernt werden. Mit "_" kann ich natürlich auch leben, aber optisch schöner finde ich schon die Leerzeichen.

>> Danke im Voraus

Bitte - du bist neu und daher verzeihe ich dir beide Böcke - den Grußlosen und das vorausdanke

Da muss ich mich für mein Unhöflichkeit entschuldigen, wo bleiben meine guten Manieren... face-sad

Beides mag ich und ein paar andere nicht.

Gruß

Grüße
don.redhorse
don.redhorse 11.05.2011 um 17:16:13 Uhr
Goto Top
HiHo,

das teste ich morgen aus, danke.

Habe gerade keine Windowskiste hier...

Gruß
60730
60730 12.05.2011 um 09:15:15 Uhr
Goto Top
salü,

dann "probieren" wir das mal... - wobei probieren heist, ich sitze vor nem Mac.

Der Dateiname ist immer:
"PO Bestellung 145123456 vom tt.mm.jjjj.pdf"

for /f %%a in ('dir /b PO*.pdf') do echo %%a  

Bastla hat einen schönen Weg, den er "processline" nennt - den würde ich evtl. auch nehmen.

cd /d pfad wo die dateien sind

for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines %%~na  
goto :eof

:processlines
echo %1
C:\script\pdf2txt\pdftotext.exe -layout "%1.pdf"  
if not exist %1.txt echo fehler bei Datei %1
for /f "Tokens=2,4" %%a in ('findstr  "Auftragsnummer:"') do (  
         ren %1.pdf "%%a-%%b.pdf  
         ren %1.txt "%%a-%%b.txt  
)

sorry, aber mehr ist grad - und dann noch vorm Mac - nicht drin.

Gruß
don.redhorse
don.redhorse 12.05.2011 um 12:08:30 Uhr
Goto Top
salü,

Moin, Moin,

dann "probieren" wir das mal... - wobei probieren heist, ich sitze vor nem Mac.

Das ist doch gut, vorm Mac ist immer gut ;)


Bastla hat einen schönen Weg, den er "processline" nennt - den würde ich evtl. auch nehmen.

> cd /d pfad wo die dateien sind
> 
> for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines %%~na  
> goto :eof
wenn ich in der Kommandozeile:
for /f "delims=" %a in ('dir /b PO*.pdf') do echo %a  
eingebe kommt:
PO Bestellung 145123456 vom 12.05.2011.pdf
sieht also gut aus

Das ist doch dafür da das das Script solange läuft bis es keine "PO*" mehr gibt?

:processlines
echo %1

dabei gibt er nur ein "PO" aus. Was heisst dieses %1?
damit scheitert der Rest auch, es wird also keine .txt erstellt.
habe mal etwas rumprobiert, offenbar wird der Dateiname nicht mit in die Schleife übernommen (%1 soll doch der Dateiname sein?)

C:\script\pdf2txt\pdftotext.exe -layout "%1.pdf"
if not exist %1.txt echo fehler bei Datei %1
for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer:"') do (
ren %1.pdf "%%a-%%b.pdf
ren %1.txt "%%a-%%b.txt
)


sorry, aber mehr ist grad - und dann noch vorm Mac - nicht drin.
ja trocken geht sowas schlecht.

Gruß
Skyemugen
Skyemugen 12.05.2011 um 12:56:35 Uhr
Goto Top
Aloha,

mach doch mal bitte

do call :processlines "%%~na"

Leerzeichen sind ja immer so eine Sache ;)

Schätze mal spätestens bei der .pdf sollte dann statt %1 besser %~1 stehen, sonst gibt's zu viele fliegende Zollstöcke.

greetz André
don.redhorse
don.redhorse 12.05.2011 um 13:54:16 Uhr
Goto Top
Moin,

mach doch mal bitte

do call :processlines "%%~na"

japps, dass hatte ich schon, klappt

Leerzeichen sind ja immer so eine Sache ;)

Schätze mal spätestens bei der .pdf sollte dann statt %1 besser %~1 stehen, sonst gibt's zu viele fliegende
Zollstöcke.

mit der Tilde vor der 1 klappt es, die PDF wird nun in .txt gewandelt.

was noch nicht klappt ist for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer:"') do ( die batch bleibt hinter der letzten Klammer der for Schleife stehen mit blinkenden Cursor stehen.

so sieht es jetzt aus:
cd /d c:\script\pdf2txt\

for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
goto :eof

:processlines
echo %~1
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  
if not exist "%~1.txt" echo fehler bei Datei %~1  
for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer"') do (  
	ren %~1.pdf "%%a-%%b.pdf"  
	ren %~1.txt "%%a-%%b.txt"  
pause
)

Grüße
Skyemugen
Skyemugen 12.05.2011 um 14:00:03 Uhr
Goto Top
Aloha,

ich hoffe, du hast das echo on, damit du auch siehst, wo es hapert ... eventuell wäre
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do (
funktionstüchtiger

und bitte nicht das goto :eof am Ende der processlines vergessen (also nach der letzten Klammer)

greetz André
60730
60730 12.05.2011 um 15:31:33 Uhr
Goto Top
moin,

  • lustigerweise hab ich einen Pfad C:\script\pdf2txt von daher kann ich das (und die morgigen kalten Böcke) ganz gut nachstellen...

Auftragsnummer: 40123456 / 0020
Das ist der Inhalt von einer Datei po123.pdf

Die dazugehörige 123.cmd hat den Inhalt
cd /d c:\script\pdf2txt\

for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
goto :eof

:processlines
echo %~1
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  
if not exist "%~1.txt" echo fehler bei Datei %~1  
for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer" %~1.txt') do (  
	echo ren "%~1.pdf" "%%a-%%b.pdf"  
	echo ren "%~1.txt" "%%a-%%b.txt"  
pause
)

und das kommt heraus:
C:\script\pdf2txt>(
echo ren "po123.pdf" "40123456-0020.pdf"
 echo ren "po123.txt" "40123456-0020.txt"
 pause
)
ren "po123.pdf" "40123456-0020.pdf"
ren "po123.txt" "40123456-0020.txt"
Drücken Sie eine beliebige Taste . . .

  • jetzt willst du aber
Das Ergebnis soll also so aussehen:
"40123456-xxx0 PO Bestellung 145123456 vom tt.mm.jjjj.pdf"

Ergo "müsste" der umbenamseritis Block so lauten:
        echo ren "%~1.pdf" "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.pdf"  
	echo ren "%~1.txt"   "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.txt"  

und siehe da...

C:\script\pdf2txt>(
echo ren "po123.pdf" "40123456-0020 PO Bestellung 40123456 vom 12.05.2011.pdf"

 echo ren "po123.txt"   "40123456-0020 PO Bestellung 40123456 vom 12.05.2011.txt
"
 pause
)
ren "po123.pdf" "40123456-0020 PO Bestellung 40123456 vom 12.05.2011.pdf"
ren "po123.txt"   "40123456-0020 PO Bestellung 40123456 vom 12.05.2011.txt"
Drücken Sie eine beliebige Taste . . .


wobei ich die ehrlich rate - benams die dateien nicht so krumm um - Jahr.monat.tag ist in meinen Augen besser
Und Jahr-monat-tag schöner.
don.redhorse
don.redhorse 12.05.2011 um 19:30:28 Uhr
Goto Top
Moin,

> Auftragsnummer: 40123456 / 0020
> 
Das ist der Inhalt von einer Datei po123.pdf

und da ist das Problem. Die Datei aus der eMail heisst PO Bestellung 40123456 vom 1.03.2011.pdf, d.h. ich habe in diesem Dateinamen schon die Leerzeichen..

Die dazugehörige 123.cmd hat den Inhalt
> cd /d c:\script\pdf2txt\
> 
> for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
> goto :eof
> 
> :processlines
> echo %~1
> C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  
> if not exist "%~1.txt" echo fehler bei Datei %~1  
> for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer" %~1.txt') do (  
> 	ren "%~1.pdf" "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.pdf"  
> 	ren "%~1.txt"   "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.txt"  
> pause
> )

Mit "POirgendwas.pdf" funktioniert es, aber nicht mit "PO irgendwas.pdf"

Tja, die lieben Leerzeichen unter Windows mag ich sie auch nicht.

cd /d c:\script\pdf2txt\

for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
goto :eof

:processlines
echo %~1
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  
if not exist "%~1.txt" echo fehler bei Datei %~1  
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do (  
        ren "%~1.pdf" "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.pdf"  
	ren "%~1.txt"   "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.txt"  
pause
)

Das funktioniert wunderbar, danke!

* jetzt willst du aber
> Das Ergebnis soll also so aussehen:
> "40123456-xxx0 PO Bestellung 145123456 vom tt.mm.jjjj.pdf"

wobei PO Bestellung 145123456 vom tt.mm.jjjj.pdf schon der Name der Datei ist die ich per AttachmentExtraktor aus den Mails extrahiere.

Ergo "müsste" der umbenamseritis Block so lauten:
>         echo ren "%~1.pdf" "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.pdf"  
> 	echo ren "%~1.txt"   "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.txt"  
> 

und siehe da...

die Datei hätte dann ein neues Datum im Namen. Ist im Prinzip egal, da die Datei ja eh ein Datum hat, mir persönlich reicht die SAP Nummer (äh, 4012...-00x0), aber die Kollegen möchten gerne das Datum mit in den Namen.
Ich hatte mich offenbar unklar ausgedrückt, sorry:

Zu Verarbeiten sind PDF Dateien die per Mail kommen. Die Dateien werden per Extraktor in einen Ordner kopiert. Der Dateiname ist immer:
"PO Bestellung 145123456 vom tt.mm.jjjj.pdf" so lautet der Mailanhang, auch das Datum ist so vorgegeben.

wobei ich die ehrlich rate - benams die dateien nicht so krumm um - Jahr.monat.tag ist in meinen Augen besser
Und Jahr-monat-tag schöner.

Womit ich dir voll und ganz recht gebe.

Wenn ich mir das ganze so angucke wäre folgendes Endergebniss wünschenswert:

"40123456-xxx0 Blahfasel1 Blahfasel2 145123456 jjjj-mm-tt.pdf" wobei "40123456-xxx0" und "Blahfasel1 Blahfas..." in der Datei stehen und "145123456 jjjj-mm-tt.pdf" schon als Dateiname vergeben sind. Um den Dateinamen beizubehalten hatte ich mir ja die Variable sFILE geschaffen. Also mit "40123456-xxx0 Blahfasel1 Blahfasel2 PO Bestellung 145123456 vom tt.mm.jjjj.pdf" wäre ich voll zufrieden, ohne dem "PO Bestellung" sogar noch besser aber das ist mir nicht wichtig.

Zur Erklärung wozu das ganze ist:
Wir bekommen Aufträge per Mail zugesendet, als PDF Datei. Die PDF wird schon automatisch abgetrennt. Im Dateinamen steht aber nur eine Bestellnummer mit der wir nichts anfangen können, wir benötigen die Auftragsnummer (SAP Nummer). Derzeit kopiere ich die von Hand in jede Datei. Dazu gibt es eine Kurztext Beschreibung "Blahfasel1 ..." Die steht in einer anderen Zeile, die kopiere ich auch in den Dateinamen. Ich muss die Datei also öffnen, die Nummer kopieren, Datei schliessen, Name erweitern, Datei öffnen, Kurztext kopieren, schliessen, einfügen. Genau genommen nichts schlimmes, aber doch wohl echt etwas das der Computer besser selber erledigt. Nur leider überschreitet das meine "Fähigkeiten" bei weitem.

Ich habe mir jetzt auf meinem Mac daheim eine Win7 Inst. in VirtualBox erstellt. Am Freitag werde ich wahrscheinlich nicht viel Zeit haben eure Hilfe am Tage nutzen zu können, werde also erst gegen Abend antworten können.

Danke und Gruß!
don.redhorse
don.redhorse 12.05.2011 um 19:40:39 Uhr
Goto Top
Moin,

ich hoffe, du hast das echo on, damit du auch siehst, wo es hapert ... eventuell wäre
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr
> "Auftragsnummer"') do (
funktionstüchtiger

und siehe da, so klappt es mit den Leerzeichen face-smile

und bitte nicht das goto :eof am Ende der processlines vergessen (also nach der letzten Klammer)

ist drin, echo ist auch on, wenn sie fertig ist, die Batch, dann soll die eh automatisch laufen, aber dass ist ja noch etwas hin, fürchte ich mal.

was macht das "^|"? "type" wusste ich noch (freu)

Grüße
60730
60730 12.05.2011 um 20:03:40 Uhr
Goto Top
grützi,

jetzt haben wir das Doppelwoppermenü....

  • schau dir meine Zeile 10 an:
for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer" %~1.txt') do (
  • und die von Skyemugen
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do (

  • innerhalb einer in () mußt du manche Zeichen maskieren - dazu ist ^ das da.
  • und viele Wege führen nach Rom

dir |more ist ein ziemlich alter Hut und bedeutet nix anders als
befehl1|befehl2

wobei PO Bestellung 145123456 vom tt.mm.jjjj.pdf

naja, komm erst mal in mein Alter und dann verstehst du mehr und vergißt noch mehr...

Die Idee zuhause ein M$ Maschine (wenn auch virtuell) hinzustellen - die mag ich aber garnicht - daher keine ungetesteten Schnippsel mehr.

Gruß
Biber
Biber 12.05.2011 um 20:15:13 Uhr
Goto Top
Moin don.redhorse,

willkommen im Forum.

Zitat von @don.redhorse:
was macht das "^|"? "type" wusste ich noch (freu)

Das Pipe-Zeichen"|" bedeutet die Weiterleitung einer Ausgabe als eine neue Eingabe für ein nachverarbeitendes Programm.
Einfache Beispiele wären ein "DIR | MORE" oder eben ein "TYPE datei.xyz| SORT" vom CMD-Prompt aus.
Beide Befehle machen genau das, was man/frau als Laie so erwartet ... kannst du aber beide gerne nachturnen am CMD-Prompt.

Wenn diese Befehle - so wie im Beispiel oben- nicht direkt vom CMD-Prompt aufgerufen werden, sondern in einer Aufruf-Anweisung einer FOR-Anweisung,
also dem, was in einfachen Anführungszeichen in der Klammer steht,
dann muss das Pipe-Zeichen mit einem Caret=^ maskiert werden, damit es erst später (in der Aufruf-Anweisung) wirksam wird.

Grüße
Biber
Skyemugen
Skyemugen 12.05.2011 um 20:34:06 Uhr
Goto Top
Zitat von @60730:
grützi,

jetzt haben wir das Doppelwoppermenü....


Ähm, T-Mo,

in deiner ursprünglichen Version stand kein Dateibezug (und schon gar kein %~1) ... da stand nur 'findstr "Auftragsnummer"' wenn ich mich recht erinnere ^_^ (darum kam auch nur ein Endloscursorblinken)

greetz André

und das ägyptische ^ Flöten | ist bei mir inzwischen schon so ein Standard geworden
don.redhorse
don.redhorse 12.05.2011 um 20:38:56 Uhr
Goto Top
Noch einmal Moin,
ich denke, den ersten Teil wirst du selber hinbekommen

neh, habt ihr schon gemacht.

(dafür gibt es ja reichlich Anschauungsmaterial im Forum), zum zweiten
Teil könnte ich dir eine Möglichkeit anbieten:
@echo off & setlocal enabledelayedexpansion
> for /f "tokens=1,2* delims=," %%i in ('type %temp%\bla.txt ^|findstr "ST"') do set  
> "var=%%i"  
> set "var=!var:~20,-7!"  
> echo !var!
> pause
> goto :eof

Das habe ich mal umgesetzt, in einer separaten Batch. Und siehe da, es funktioniert. Beeindruckt bin ich davon das ich es geschafft habe das umzusetzen.

set "var=!var:~20,-7!"

bedeutet doch aus der Zeile mit dem "ST" die ersten 20 Zeichen zu löschen, sind teilweise weniger, also wird noch "if" benötigt, wie du weiter unten schreibst.

Nur ein kleines Testschnipselchen, das eventuell umständlich ist aber passen sollte.
Da du .txt aus den PDF erzeugst, ist es natürlich sinnvoll dann auch die Information aus der .txt auszulesen.

greetz André

P.S.: Sollte sich die Stückzahl mehrstelligen schönes Wort *gg*, kann es je nach Formatierung sein, dass var
dann noch ein paar Leerzeichen enthält ...
edit gut mit ein wenig if lässt sich auch noch das Letztere eindeutig setzen ^_^

P.P.S.: Das enabledelayedexpansion ist diesbezüglich eigentlich kein muss, da es auch mit set"var=%var:~20,-7%" und diesbezüglich echo %var% funktioniert aber irgendwie habe ich so das Gefühl, dass
man hier in der Gesamtheit am Ende sowieso die Erweiterung benötigen wird.

OK, Bahnhof face-sad

jetzt die Preisfrage, wie bekomme ich deine for /f Schleife in die von Timo rein?

Grüße
don.redhorse
don.redhorse 12.05.2011 um 20:56:54 Uhr
Goto Top
Guten Abend!

jetzt haben wir das Doppelwoppermenü....
...
> dir |more ist ein ziemlich alter Hut und bedeutet nix anders als
> befehl1|befehl2

Jetzt fällt es wie Schuppen aus den, äh, von den Augen, klar, das kennt man noch.

naja, komm erst mal in mein Alter und dann verstehst du mehr und vergißt noch mehr...

Och, vergessen kann ich schon ganz gut. Ich glaube aber auch das man das darf, dürfte bei mir jetzt rd. 10 Jahre her sein als ich das letzte mal etwas mit Batch Dateien gemacht habe und das war dann meist auch Linux. Ich glaube viel mehr als "rm", "mv" und "cp" kenne ich gar nicht mehr. Einiges kommt zwar wieder, aber richtig greifbar ist noch nichts.

Die Idee zuhause ein M$ Maschine (wenn auch virtuell) hinzustellen - die mag ich aber garnicht - daher keine
ungetesteten Schnippsel mehr.

Tja, ich muss ja irgendwie lesen und üben. Tagsüber habe ich dazu leider nicht genug Zeit. Ich mag die M$ freie Zeit auch sehr gerne ;)

Grüße
don.redhorse
don.redhorse 12.05.2011 um 21:04:31 Uhr
Goto Top
reMoin,

danke für die Erklärung, das "^" hatte mich wohl verwirrt. "|" habe ich früher auch viel verwendet, im Zusammenhang mit "grep" beim Auswerten von Log Dateien. Aber das ist eben diese rd. 10 Jahre her.

Zu meiner Verteidigung muss ich sagen das ich schon einige Tage mehr an diesem Problem wurschtel, die meisten Ideen habe ich aus eurem Forum und auch aus deinen Tuts. aber so wie ihr mir jetzt unter die Arme greift werden meine lichten Momente häufiger, ich glaube ohne eure Hilfe würde das für mich ne Jahresaufgabe werden.

Mir schwirrt jetzt aber der Kopf, erst die VM aufsetzen, dann wieder ausprobieren und verstehen versuchen, denke für heute mache ich Schluss.

Danke an alle!

Grüße

Torsten
don.redhorse
don.redhorse 17.05.2011 um 08:53:09 Uhr
Goto Top
Moin!

bin wieder etwas zum Bsteln gekommen, so sieht es jetzt aus:

setlocal enabledelayedexpansion
set "Dateiname=0"  

cd /d c:\script\pdf2txt\

for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
goto :eof

:processlines
set Dateiname=%~1
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  
if not exist "%~1.txt" echo fehler bei Datei %~1  
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "ST"') do set "var=%%i"  
	set "var=!var:~19,-7!"  
	echo !var!
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do (  
	ren "%~1.pdf" "%%a %%b !var! %Dateiname%.pdf"  
pause
)
goto :eof
:EOF

Klappt schon fast wie gewünscht.
Fast: Die Leerzeichen machen ärger.
Diese Zeile soll ja teilweise in den Dateinamen:
0010                Stand 222 nach Stand31 im 1.OG&3.OG R269                                                      1,000               ST     0.000,00        EUR          1ST                0.000,00
"Stand 222 nach Stand31 im 1.OG&3.OG R269"
diesen Part benötige ich im Dateinamen
Jetzt sieht der Dateiname so aus:
40123456 0030  Stand 222 nach Stand31 im 1.OG&3.OG R269                                                 PO Bestellung 145123456 vom 28.01.2011

Meine Frage jetzt, wie bekomme ich die überflüssigen Leerzeichen raus?

Grüße
60730
60730 17.05.2011 um 09:45:20 Uhr
Goto Top
Zitat von @don.redhorse:
Moin!
Meine Frage jetzt, wie bekomme ich die überflüssigen Leerzeichen raus?

Das ist einfach und trotzdem kompliziert - ok ich hatte noch keinen Kaffee...

C:\>set bsp=t                    e              s              t

C:\>echo "%bsp%"
"t                    e              s              t"

C:\>set bsp=%bsp:  = %

C:\>echo "%bsp%"
"t          e       s       t"

C:\>set bsp=%bsp:  = %

C:\>echo "%bsp%"
"t     e    s    t"

C:\>set bsp=%bsp:  = %

C:\>echo "%bsp%"
"t   e  s  t"

C:\>
Ergo - baue da drum eine schleife und nutz eine zweite Variable - die solange läuft wie bsp & bsp2 nicht identisch sind.
Sind Sie identisch gibt es keine doppelten Spaces mehr.

Wäre jetz meine Spontane Idee, ohne Kaffee im Kopp


Grüße

zurück.
don.redhorse
don.redhorse 17.05.2011 um 14:37:33 Uhr
Goto Top
Hallo Timo,

jetzt sieht es so aus:

@echo off
setlocal enabledelayedexpansion
set "Dateiname=0"  
chcp 1252
cd /d c:\script\pdf2txt\
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
goto :eof

:processlines
set Dateiname=%~1
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  
if not exist "%~1.txt" echo fehler bei Datei %~1  
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "ST"') do set "var=%%i"  
set "var=!var:~18,-7!"  
rem echo !var!
:loop1
if "%var:~0,1%"==" " set "var=%var:~1%" & goto :loop1  
:loop2
if "%var:~-1%"==" " set "var=%var:~0,-1%" & goto :loop2  
rem echo Nachher: #%var%#

for /f "tokens=2 delims=:+" %%i in ('type "%~1.txt" ^|findstr "standhaltung:"') do set "nam=%%i"  
set "nam=!nam:~0,-1!"  
rem echo !nam!
:loop11
if "%nam:~0,1%"==" " set "nam=%nam:~1%" & goto :loop11  
:loop21
if "%nam:~-1%"==" " set "nam=%nam:~0,-1%" & goto :loop21  
rem echo Nachher: #%nam%#

for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do (  
	echo "%~1.pdf" "%%a %%b ## !var! %Dateiname% %nam%.pdf"  
	ren "%~1.pdf" "%%a %%b ## !var! %Dateiname% %nam%.pdf"  
)
del *.txt
:eof

die Variable %nam"% ist der Auftrgsgeber. Jetzt kann man anhand des Dateinamens erkennen welche Auftragsnummer man bearbeitet, was zu tun ist und von wem der Auftrag kommt. Mit dem Ursprünglichen Namen der PDF hatte man nur eine Nummer die die Rechnungsprüfung benötigt. Wenn also 10 Aufträge am Tag reinkommen musste jeder alle Aufträge öffnen und gucken wer denn jetzt welche ab arbeiten muss.

Jetzt noch eine Frage (wie hätte es auch anders sein sollen): Welche Abfragen sind noch sinnvoll? Also klappt das "Umbenamsen" nicht, bleibt der alte Name bestehen, schmlimmstenfalls bleibt die batch stehen -> Handarbeit. Oder übersehe ich da was?

Grüße und Dank!
Torsten
60730
60730 17.05.2011 um 14:49:48 Uhr
Goto Top
moin,

wird jetzt alles bisschen.... (Kaffee hatte ich zwar schon - aber die Wirkung würgt nicht mehr..)

  • mach doch - am besten an den allerletzten Kommentar anfügen - eine Demo - so wie ich in type=plain.

Welche Abfragen sind noch sinnvoll?
  • naja spontan - ist die datei geöffnet, gibts den neuen namen schon vorher - bzw. wurde sie umbenamst.
Und nimm um gates willes das Echo off raus, solange das nicht niet und nagelfest ist.
don.redhorse
don.redhorse 17.05.2011 um 17:08:56 Uhr
Goto Top
* mach doch - am besten an den allerletzten Kommentar anfügen - eine Demo - so wie ich in type=plain.

Wenn es fertig ist face-smile

> Welche Abfragen sind noch sinnvoll?
  • naja spontan - ist die datei geöffnet, gibts den neuen namen schon vorher - bzw. wurde sie umbenamst.

Geöffnet, sollte ja nicht, da das ganze später komplett ohne Userzugriff laufen soll. Dazu suche ich aber noch einen Mailer der Mails abholen kann, auch wenn der User abgemeldet ist. Aber ist ne andere Baustelle. Derzeit läuft es mit Thunderbird und dem Addon Attachment Extractor. Dort kann man am Ende des Extrakten ein Programm starten (cmd), leider kann man keine Parameter übergeben (die Batch), hätte ich vielleicht vorher testen sollen... OK, auch andere Baustelle.
Ich gucke mal ob ich das hinbekomme, geöffnet sollte gehen. Schon umbenamst wird interessant, da die umbenannten Dateien noch eine Projektnummer bekommen und in andere Ordner verschoben werden... Auf jeden Fall muss ich eine Logdatei anlegen.

Und nimm um gates willes das Echo off raus, solange das nicht niet und nagelfest ist.

Jau, war zum testen auch nicht drin, hatte ich nur beim Demo Testlauf fürn Kollegen reingenommen, die echos sind "oben" ja auch ge"rem"t.

Diese Woche werde ich da wohl nicht mehr groß zu kommen, melde mich wieder sobald es weiter geht.

Grüße und noch einen angenehmen Tag.
don.redhorse
don.redhorse 12.10.2011 um 10:40:55 Uhr
Goto Top
Hallo,

auch wenn es lange lange her ist, das ganze ist immer noch im Testbetrieb. Im Prinzip funktioniert es auch schon ganz gut, ich habe jetzt nur noch Probleme mit Zeichen die nicht in Dateinamen vorkommen dürfen. Insbesondere """ und "/" werden gerne verwendet.

Dazu habe ich, natürlich, hier auch gesucht und auch eine Lösung gefunden. Nur die Umsetzung ist mehr als unschön.

Es betrifft folgenden Teil der Batch:
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i"  
set "var=!var:~18,-1!"  

in der Zeile steht dann soetwas wie:

bringe bitte die Bananen in Raum "D" / "C"  

Am Ende der Batch wird aus diversen Variablen der Dateiname zusammen gesetzt. Kommt in "var" nun ein """ oder "/" vor knallt es natürlich.

"Meine Lösung" (ist natürlich hier aus dem Forum kopiert) sieht so aus:

if not exist "%~1.txt" echo Fehler bei Datei %~1 >> "Aufträge.log"  
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i"  
set "var=!var:~18,-1!"  

echo %var%
call b.cmd %var%>kopie.txt
echo call Ende
pause

for /f "tokens=* delims=," %%i in ('type "kopie1.txt" ') do set "var=%%i"  

echo %var%
pause
if exist kopie.txt del kopie.txt

mit diesem Part rufe ich also eine weitere Batch auf:

@ECHO OFF
setlocal enabledelayedexpansion
rem echo b.cmd %datei%
for /f "delims=" %%i in ("%var%") do (  
	set "line=%%i"   
	echo !line:/=!
)
call c.cmd>kopie1.txt
goto :EOF
:EOF

und damit noch eine:
@ECHO OFF
setlocal enabledelayedexpansion
for /f "tokens=* delims=," %%i in ('type "kopie.txt" ') do set "var=%%i"  
for /f "delims=" %%i in ("%var%") do (  
	set "line=%%i"   
	echo !line:"=!  
)

goto :EOF
:EOF

das ganze funktioniert zwar, erscheint mir aber sehr sehr unschön.

Wie bekomme ich die Zeile "echo !line:"=!" direkt auf eine Variable? Oder, wie kann ich ""/\&" sonst aus der Variable "var" rauswerfen?

Ich hänge hier noch einmal die gesamte Batch an:

@echo off
setlocal enabledelayedexpansion
set "Dateiname=0"  
@chcp 1252
cd /d "C:\Users\Public\Documents\Aufträge"  
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
goto :eof

:processlines
set Dateiname=%~1
echo %Dateiname% >> "Aufträge.log"  
for /f "tokens=3,4,5 delims= " %%a in ("%Dateiname%") do set Datei=%%a %%b %%c  

C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  

if not exist "%~1.txt" echo Fehler bei Datei %~1 >> "Aufträge.log"  
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i"  
set "var=!var:~18,-1!"  

echo %var%
call b.cmd %var%>kopie.txt
echo call Ende
pause

for /f "tokens=* delims=," %%i in ('type "kopie1.txt" ') do set "var=%%i"  

echo %var%
pause
if exist kopie.txt del kopie.txt
:loop1
echo !var!
if "%var:~0,1%"==" " set "var=%var:~1%" & goto :loop1  
:loop2
if "%var:~-1%"==" " set "var=%var:~0,-1%" & goto :loop2  
rem echo Nachher: #%var%#

for /f "tokens=2 delims=:+" %%i in ('type "%~1.txt" ^|findstr "standhaltung:"') do set "nam=%%i"  
set "nam=!nam:~0,-1!"  

:loop11
echo !nam!

if "%nam:~0,1%"==" " set "nam=%nam:~1%" & goto :loop11  
:loop21
if "%nam:~-1%"==" " set "nam=%nam:~0,-1%" & goto :loop21  
rem echo Nachher: %nam%

for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do (  
	echo %%a %%b !var! %Datei% %nam%.pdf
	echo 	%%a %%b !var! %Datei% %nam%.pdf >> "Aufträge.log"  
	ren "%~1.pdf" "%%a %%b !var! %Datei% %nam%.pdf"  
	del "%Dateiname%.txt"  
rem pause
)
rem pause
:eof

Wie gesagt, es "funktioniert", sieht aber echt nicht mehr schön aus.

Grüße aus dem verregneten Münster
60730
60730 12.10.2011 um 11:00:10 Uhr
Goto Top
Servus,

Wie gesagt, es "funktioniert", sieht aber echt nicht mehr schön aus.

Yupp - ich hab den Überblick verloren - eine(n) meiner letzten Antworten gelesen und einen Groben Bock gefunden, den du in deiner Zeile 12 übernommen hast...
12. for /f "tokens=3,4,5 delims= " %%a in ("%Dateiname%") do set Datei=%%a %%b %%c
12. for /f "tokens=3,4,5 delims= " %%a in ("%Dateiname%") do set "Datei"="%%a %%b %%c"

Oder andersherum - bitte mach ein neues Thema auf mit der aktuellen Version und verlinke zu diesem Beitrag - denn hier findet man "nix" mehr in Reih und Glied.

Grüße aus dem verregneten Münster
zurück