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

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

Frage Entwicklung Batch & Shell

Mitglied: don.redhorse

don.redhorse (Level 1) - Jetzt verbinden

11.05.2011 um 15:18 Uhr, 4462 Aufrufe, 25 Kommentare

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.

01.
rem StartPfad ohne abschließenden \ angeben!  
02.
 
03.
set "Quellverzeichnis=C:\script\pdf2txt" 
04.
set "Quelldatei=*.pdf" 
05.
set "Pufferverzeichnis=C:\script\pdf2txt\buffer" 
06.
set "sFullname=C:\script\pdf2txt\*pdf"  
07.
set "SuchString=Auftragsnummer:" 
08.
 
09.
for %%i in ("%sFullname%") do set sFILE=%%~ni%%~xi 
10.
 
11.
for %%i in (%Quellverzeichnis%\%Quelldatei%) do (C:\script\pdf2txt\pdftotext.exe -layout "%%i"  
12.
findstr  "%SuchString%" "%Quellverzeichnis%\%%~ni.txt">%Pufferverzeichnis%\info.log 
13.
14.
 
15.
for /f "Tokens=2,4" %%a in (%Pufferverzeichnis%\info.log) do ren "%Quellverzeichnis%\*.pdf" "%%a-%%b-%sFILE%"
Ein Auszug aus der PDF:
01.
0010                blablaba1 blablaba2 blablaba3      1,000  ST                                                              xxxx,xx        EUR          1ST   
02.
        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
Mitglied: 60730
11.05.2011 um 15:26 Uhr
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ß
Bitte warten ..
Mitglied: Skyemugen
11.05.2011 um 16:23 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
for /f "tokens=1,2* delims=," %%i in ('type %temp%\bla.txt ^|findstr "ST"') do set "var=%%i" 
03.
set "var=!var:~20,-7!" 
04.
echo !var! 
05.
pause 
06.
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.
Bitte warten ..
Mitglied: don.redhorse
11.05.2011 um 16:56 Uhr
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...

Beides mag ich und ein paar andere nicht.

Gruß

Grüße
Bitte warten ..
Mitglied: don.redhorse
11.05.2011 um 17:16 Uhr
HiHo,

das teste ich morgen aus, danke.

Habe gerade keine Windowskiste hier...

Gruß
Bitte warten ..
Mitglied: 60730
12.05.2011 um 09:15 Uhr
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"

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

01.
cd /d pfad wo die dateien sind 
02.
 
03.
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines %%~na 
04.
goto :eof 
05.
 
06.
:processlines 
07.
echo %1 
08.
C:\script\pdf2txt\pdftotext.exe -layout "%1.pdf" 
09.
if not exist %1.txt echo fehler bei Datei %1 
10.
for /f "Tokens=2,4" %%a in ('findstr  "Auftragsnummer:"') do ( 
11.
         ren %1.pdf "%%a-%%b.pdf 
12.
         ren %1.txt "%%a-%%b.txt 
13.
)
sorry, aber mehr ist grad - und dann noch vorm Mac - nicht drin.

Gruß
Bitte warten ..
Mitglied: don.redhorse
12.05.2011 um 12:08 Uhr
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.

01.
> cd /d pfad wo die dateien sind 
02.
>  
03.
> for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines %%~na 
04.
> goto :eof
wenn ich in der Kommandozeile:
01.
for /f "delims=" %a in ('dir /b PO*.pdf') do echo %a
eingebe kommt:
01.
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
)
</code>

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

Gruß
Bitte warten ..
Mitglied: Skyemugen
12.05.2011 um 12:56 Uhr
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é
Bitte warten ..
Mitglied: don.redhorse
12.05.2011 um 13:54 Uhr
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:
01.
cd /d c:\script\pdf2txt\ 
02.
 
03.
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na" 
04.
goto :eof 
05.
 
06.
:processlines 
07.
echo %~1 
08.
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf" 
09.
if not exist "%~1.txt" echo fehler bei Datei %~1 
10.
for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer"') do ( 
11.
	ren %~1.pdf "%%a-%%b.pdf" 
12.
	ren %~1.txt "%%a-%%b.txt" 
13.
pause 
14.
)
Grüße
Bitte warten ..
Mitglied: Skyemugen
12.05.2011 um 14:00 Uhr
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é
Bitte warten ..
Mitglied: 60730
12.05.2011 um 15:31 Uhr
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
01.
cd /d c:\script\pdf2txt\ 
02.
 
03.
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na" 
04.
goto :eof 
05.
 
06.
:processlines 
07.
echo %~1 
08.
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf" 
09.
if not exist "%~1.txt" echo fehler bei Datei %~1 
10.
for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer" %~1.txt') do ( 
11.
	echo ren "%~1.pdf" "%%a-%%b.pdf" 
12.
	echo ren "%~1.txt" "%%a-%%b.txt" 
13.
pause 
14.
)
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:
01.
        echo ren "%~1.pdf" "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.pdf" 
02.
	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.
Bitte warten ..
Mitglied: don.redhorse
12.05.2011 um 19:30 Uhr
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
01.
> cd /d c:\script\pdf2txt\ 
02.
>  
03.
> for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na" 
04.
> goto :eof 
05.
>  
06.
> :processlines 
07.
> echo %~1 
08.
> C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf" 
09.
> if not exist "%~1.txt" echo fehler bei Datei %~1 
10.
> for /f "Tokens=2,4" %%a in ('findstr "Auftragsnummer" %~1.txt') do ( 
11.
> 	ren "%~1.pdf" "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.pdf" 
12.
> 	ren "%~1.txt"   "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.txt" 
13.
> pause 
14.
> )

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

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

01.
cd /d c:\script\pdf2txt\ 
02.
 
03.
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na" 
04.
goto :eof 
05.
 
06.
:processlines 
07.
echo %~1 
08.
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf" 
09.
if not exist "%~1.txt" echo fehler bei Datei %~1 
10.
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do ( 
11.
        ren "%~1.pdf" "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.pdf" 
12.
	ren "%~1.txt"   "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.txt" 
13.
pause 
14.
)
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:
01.
>         echo ren "%~1.pdf" "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.pdf" 
02.
> 	echo ren "%~1.txt"   "%%a-%%b PO Bestellung %%a vom %date:~-10,2%.%date:~-7,2%.%date:~-4%.txt" 
03.
> 
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ß!
Bitte warten ..
Mitglied: don.redhorse
12.05.2011 um 19:40 Uhr
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

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
Bitte warten ..
Mitglied: 60730
12.05.2011 um 20:03 Uhr
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ß
Bitte warten ..
Mitglied: Biber
12.05.2011 um 20:15 Uhr
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
Bitte warten ..
Mitglied: Skyemugen
12.05.2011 um 20:34 Uhr
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
Bitte warten ..
Mitglied: don.redhorse
12.05.2011 um 20:38 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
> for /f "tokens=1,2* delims=," %%i in ('type %temp%\bla.txt ^|findstr "ST"') do set 
03.
> "var=%%i" 
04.
> set "var=!var:~20,-7!" 
05.
> echo !var! 
06.
> pause 
07.
> 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

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

Grüße
Bitte warten ..
Mitglied: don.redhorse
12.05.2011 um 20:56 Uhr
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
Bitte warten ..
Mitglied: don.redhorse
12.05.2011 um 21:04 Uhr
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
Bitte warten ..
Mitglied: don.redhorse
17.05.2011 um 08:53 Uhr
Moin!

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

01.
setlocal enabledelayedexpansion 
02.
set "Dateiname=0" 
03.
 
04.
cd /d c:\script\pdf2txt\ 
05.
 
06.
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na" 
07.
goto :eof 
08.
 
09.
:processlines 
10.
set Dateiname=%~1 
11.
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf" 
12.
if not exist "%~1.txt" echo fehler bei Datei %~1 
13.
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "ST"') do set "var=%%i" 
14.
	set "var=!var:~19,-7!" 
15.
	echo !var! 
16.
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do ( 
17.
	ren "%~1.pdf" "%%a %%b !var! %Dateiname%.pdf" 
18.
pause 
19.
20.
goto :eof 
21.
:EOF
Klappt schon fast wie gewünscht.
Fast: Die Leerzeichen machen ärger.
Diese Zeile soll ja teilweise in den Dateinamen:
01.
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:
01.
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
Bitte warten ..
Mitglied: 60730
17.05.2011 um 09:45 Uhr
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.
Bitte warten ..
Mitglied: don.redhorse
17.05.2011 um 14:37 Uhr
Hallo Timo,

jetzt sieht es so aus:

01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
set "Dateiname=0" 
04.
chcp 1252 
05.
cd /d c:\script\pdf2txt\ 
06.
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na" 
07.
goto :eof 
08.
 
09.
:processlines 
10.
set Dateiname=%~1 
11.
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf" 
12.
if not exist "%~1.txt" echo fehler bei Datei %~1 
13.
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "ST"') do set "var=%%i" 
14.
set "var=!var:~18,-7!" 
15.
rem echo !var! 
16.
:loop1 
17.
if "%var:~0,1%"==" " set "var=%var:~1%" & goto :loop1 
18.
:loop2 
19.
if "%var:~-1%"==" " set "var=%var:~0,-1%" & goto :loop2 
20.
rem echo Nachher: #%var%# 
21.
 
22.
for /f "tokens=2 delims=:+" %%i in ('type "%~1.txt" ^|findstr "standhaltung:"') do set "nam=%%i" 
23.
set "nam=!nam:~0,-1!" 
24.
rem echo !nam! 
25.
:loop11 
26.
if "%nam:~0,1%"==" " set "nam=%nam:~1%" & goto :loop11 
27.
:loop21 
28.
if "%nam:~-1%"==" " set "nam=%nam:~0,-1%" & goto :loop21 
29.
rem echo Nachher: #%nam%# 
30.
 
31.
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do ( 
32.
	echo "%~1.pdf" "%%a %%b ## !var! %Dateiname% %nam%.pdf" 
33.
	ren "%~1.pdf" "%%a %%b ## !var! %Dateiname% %nam%.pdf" 
34.
35.
del *.txt 
36.
: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
Bitte warten ..
Mitglied: 60730
17.05.2011 um 14:49 Uhr
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.
Bitte warten ..
Mitglied: don.redhorse
17.05.2011 um 17:08 Uhr
* mach doch - am besten an den allerletzten Kommentar anfügen - eine Demo - so wie ich in type=plain.

Wenn es fertig ist

> 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.
Bitte warten ..
Mitglied: don.redhorse
12.10.2011 um 10:40 Uhr
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:
01.
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i" 
02.
set "var=!var:~18,-1!"
in der Zeile steht dann soetwas wie:

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

01.
if not exist "%~1.txt" echo Fehler bei Datei %~1 >> "Aufträge.log" 
02.
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i" 
03.
set "var=!var:~18,-1!" 
04.
 
05.
echo %var% 
06.
call b.cmd %var%>kopie.txt 
07.
echo call Ende 
08.
pause 
09.
 
10.
for /f "tokens=* delims=," %%i in ('type "kopie1.txt" ') do set "var=%%i" 
11.
 
12.
echo %var% 
13.
pause 
14.
if exist kopie.txt del kopie.txt
mit diesem Part rufe ich also eine weitere Batch auf:

01.
@ECHO OFF 
02.
setlocal enabledelayedexpansion 
03.
rem echo b.cmd %datei% 
04.
for /f "delims=" %%i in ("%var%") do ( 
05.
	set "line=%%i"  
06.
	echo !line:/=! 
07.
08.
call c.cmd>kopie1.txt 
09.
goto :EOF 
10.
:EOF
und damit noch eine:
01.
@ECHO OFF 
02.
setlocal enabledelayedexpansion 
03.
for /f "tokens=* delims=," %%i in ('type "kopie.txt" ') do set "var=%%i" 
04.
for /f "delims=" %%i in ("%var%") do ( 
05.
	set "line=%%i"  
06.
	echo !line:"=! 
07.
08.
 
09.
goto :EOF 
10.
: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:

01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
set "Dateiname=0" 
04.
@chcp 1252 
05.
cd /d "C:\Users\Public\Documents\Aufträge" 
06.
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na" 
07.
goto :eof 
08.
 
09.
:processlines 
10.
set Dateiname=%~1 
11.
echo %Dateiname% >> "Aufträge.log" 
12.
for /f "tokens=3,4,5 delims= " %%a in ("%Dateiname%") do set Datei=%%a %%b %%c 
13.
 
14.
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf" 
15.
 
16.
if not exist "%~1.txt" echo Fehler bei Datei %~1 >> "Aufträge.log" 
17.
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i" 
18.
set "var=!var:~18,-1!" 
19.
 
20.
echo %var% 
21.
call b.cmd %var%>kopie.txt 
22.
echo call Ende 
23.
pause 
24.
 
25.
for /f "tokens=* delims=," %%i in ('type "kopie1.txt" ') do set "var=%%i" 
26.
 
27.
echo %var% 
28.
pause 
29.
if exist kopie.txt del kopie.txt 
30.
:loop1 
31.
echo !var! 
32.
if "%var:~0,1%"==" " set "var=%var:~1%" & goto :loop1 
33.
:loop2 
34.
if "%var:~-1%"==" " set "var=%var:~0,-1%" & goto :loop2 
35.
rem echo Nachher: #%var%# 
36.
 
37.
for /f "tokens=2 delims=:+" %%i in ('type "%~1.txt" ^|findstr "standhaltung:"') do set "nam=%%i" 
38.
set "nam=!nam:~0,-1!" 
39.
 
40.
:loop11 
41.
echo !nam! 
42.
 
43.
if "%nam:~0,1%"==" " set "nam=%nam:~1%" & goto :loop11 
44.
:loop21 
45.
if "%nam:~-1%"==" " set "nam=%nam:~0,-1%" & goto :loop21 
46.
rem echo Nachher: %nam% 
47.
 
48.
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do ( 
49.
	echo %%a %%b !var! %Datei% %nam%.pdf 
50.
	echo 	%%a %%b !var! %Datei% %nam%.pdf >> "Aufträge.log" 
51.
	ren "%~1.pdf" "%%a %%b !var! %Datei% %nam%.pdf" 
52.
	del "%Dateiname%.txt" 
53.
rem pause 
54.
55.
rem pause 
56.
:eof
Wie gesagt, es "funktioniert", sieht aber echt nicht mehr schön aus.

Grüße aus dem verregneten Münster
Bitte warten ..
Mitglied: 60730
12.10.2011 um 11:00 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Microsoft Office
gelöst Excel Pdf Datei als Icon Symbol in Word einfügen per Drag and drop? (4)

Frage von Geforce zum Thema Microsoft Office ...

VB for Applications
gelöst PDF Datei auslesen und per VBA in Excel schreiben (3)

Frage von Julian8990 zum Thema VB for Applications ...

Batch & Shell
2 String aus PDF auslesen und diesen zum Umbenamsen benutzen (8)

Frage von ingo101 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...