quan81
Goto Top

Txt Inhalt in batch variabel verwenden

Liebes Forum ich bin neu dabei und freu mich wenn mir jemand helfen kann.
Ich versuche per .bat file aus einzelnen pdfs eine pdf zu erzeugen.
Diese Variante funktioniert auch aber nur wenn im txt-file die einzelnen files hintereinander mit einem Leerzeichen aufgeführt werden.
file1.pdf file2.pdf file3.pdf

@echo off
SET /p fn=Auftrag:
SET /p list=<%fn%.txt
C:\PDFtkServer\bin\pdftk.exe %list% cat output %fn%.pdf

leider habe ich nur ein txt-file wo die einzelnen Files untereinander stehen.
file1.pdf
file2.pdf
file3.pdf
jetzt habe ich einiges gelesen, dass es mit einer Schleife möglich sein sollte.

Kann mir hier jemand helfen? Bitte!

Content-Key: 350722

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

Printed on: April 19, 2024 at 02:04 o'clock

Member: Pjordorf
Pjordorf Oct 04, 2017 at 11:10:54 (UTC)
Goto Top
Hallo,

Zitat von @quan81:
leider habe ich nur ein txt-file wo die einzelnen Files untereinander stehen.
Dann wirst du deine Quelle halt umschreiben müssen. Such mal nach z.B. "batch textdatei site:administrator.de" und du wirst auch diesen hier finden Batch- Textdatei Zeilenweise auslesen

Gruß,
Peter
Member: quan81
quan81 Oct 04, 2017 at 12:11:58 (UTC)
Goto Top
Vielen Dank für die Antwort. Ich muss zugeben es ist für mich ziemliches Neuland sorry.
Aber so wie den Beitrag verstehe geht es darum, dass ein commando jede einzelne Zeile aus der txt sich vornimmt und einzeln abspeichert.
Das was ich benötige ist ja innerhalb eines commandos den Inhalt der txt. Oder verstehe ich es ganz falsch?
Member: rubberman
rubberman Oct 04, 2017 at 17:26:15 (UTC)
Goto Top
Wenn ich dich richtig verstanden habe, brauchst du alle Dateinamen aus der Textdatei leerzeichengetrennt in Variable list.

Ungetestet:
@echo off &setlocal EnableDelayedExpansion
set /p "fn=Auftrag: "  
if not exist "!fn!.txt" exit /b  

set "list="  
<"!fn!.txt" (  
  for /f %%i in ('type "!fn!.txt"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "line=" & set /p "line="  
    if defined line set "list=!list!"!line!" "  
  )
)

call "C:\PDFtkServer\bin\pdftk.exe" !list! cat output "!fn!.pdf"  

Grüße
rubberman
Member: quan81
quan81 Oct 05, 2017 at 07:17:00 (UTC)
Goto Top
Vielen Dank rubberman,
ja du hast mich genau richtig verstanden! Nur leider bekomme ich eine Fehlermeldung das die daten nicht gefunden werden können.
Ich muss dazu sagen das in der txt Datei die Pfade der Daten stehen in Anführungszeichen.
Beispiel: "\\SRV01\ORDERBASE ERP 3.0\DATENARCHIV SPEICHERORTE\SONSTIGES\132490-9101-Sheet- 1.PDF"

Anbei noch die Fehlermeldung. Vielen dank schon im Voraus!
screenshot_1
Member: Biber
Biber Oct 05, 2017 updated at 08:36:20 (UTC)
Goto Top
Moin quan81,

wenn du dieselbe Frage in mehreren Foren stellst, dann verlinke die Beiträge bitte.
Also gib in jedem Forum an, wo sich ahnungslose Helfer doppelte Arbeit machen.
Hier zum Beispiel wäre ein Link auf https://www.tutorials.de/threads/txt-inhalt-in-batch-variabel-verwenden. ... angebracht.
In dem anderen Forum ein Link auf diesen Beitrag.

Grüße
Biber
Member: quan81
quan81 Oct 05, 2017 at 09:27:29 (UTC)
Goto Top
Hallo Biber,
vielen dank für den Hinweis ich werde darauf achten sorry.
Member: rubberman
rubberman Oct 05, 2017 at 12:15:53 (UTC)
Goto Top
Wenn die Pfade schon Anführungszeichen haben, dann ändere Zeile 9 wie folgt
    if defined line set "list=!list!!line! "   
Grüße
rubberman
Member: quan81
quan81 Oct 05, 2017 at 12:53:25 (UTC)
Goto Top
Hallo rubberman,
jetzt klappt es! Vielen Dank!
Leider bekomme ich bei meinen Langen Pfaden ca bei Zeile 80 der txt das Problem das die aufgelöstes Comando Zeile 13 zu lang wird und das system aussteigt.
Hat mir der Kollege Biber hier drauf hingewiesen!
Hättest du eine Idee wie man diese Problem lösen könnte wenn man ca auf 200 Zeilen kommen muss?
mein Gedanke war das man erst 50 Zeilen bearbeitet eine pdf1 erzeugt dann weiter 50 Zeilen bearbeitet und eine weiter pdf2 ....
so max 200 Zeilen also vier mal. und zum Schluss aus pdf1 pdf2 pdf3 dpf4 die gesammt-pdf machen und löscht pdf1 pdf2 pdf3 dpf4?

Ich hoffe man kann mir folgen. Oder ist sowas schwierig?

Danke euch jetzt schon herzlich für eure Hilfe!!!
Member: quan81
quan81 Oct 05, 2017 at 13:19:51 (UTC)
Goto Top
Noch ein Gedanke! Da der Hauptpfad immer der gleiche ist kann ich nur die Benennung des file verketten und dadurch wäre die comandozeile länge viel kürzer.
Oder kommt es aufs gleiche raus?

Vielen dank
Member: rubberman
Solution rubberman Oct 05, 2017, updated at Oct 06, 2017 at 08:15:58 (UTC)
Goto Top
Um zu wissen ob ein relativer Pfad irgend einen Unterschied machen würde, müsste man wissen, wie lang dein "Hauptpfad" ist. Wenn du am Ende das String-Limit von 8191 Zeichen trotzdem Überschreites, bringt das nichts.

Vorschlag (wieder ungetestet):
@echo off &setlocal EnableDelayedExpansion
set /p "fn=Auftrag: "  
if not exist "!fn!.txt" exit /b  

set "list="  
set /a "sum=0"  
<"!fn!.txt" (  
  for /f %%i in ('type "!fn!.txt"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "line=" & set /p "line="  
    if defined line (
      set "list=!list!!line! "  
      set "str=A!line!"  
      set "len=0"  
      for /l %%k in (12,-1,0) do (
        set /a "len|=1<<%%k"  
        for %%l in (!len!) do if "!str:~%%l,1!"=="" set /a "len&=~1<<%%k"  
      )
      set /a "sum+=len"  
      if !sum! gtr 7000 (
        call "C:\PDFtkServer\bin\pdftk.exe" !list! cat output "!fn!_tmp.pdf"  
        move /y "!fn!_tmp.pdf" "!fn!.pdf"  
        set "list="!fn!.pdf" "  
        set /a "sum=0"  
      )
    )
  )
)

call "C:\PDFtkServer\bin\pdftk.exe" !list! cat output "!fn!_tmp.pdf"  
move /y "!fn!_tmp.pdf" "!fn!.pdf"  
Grüße
rubberman
Member: quan81
quan81 Oct 06, 2017 at 06:07:27 (UTC)
Goto Top
Hallo rubberman,
erstmal ein großes Lob und vielen vielen dank dir für deine Hilfe und Einsatz!
Werde gleich paar Tests machen mit dem neun script! Freu mich schon drauf! face-wink

Zu dem Pfad.
Das ist der Dateipfad:
"\\SRV01\ORDERBASE ERP 3.0\DATENARCHIV SPEICHERORTE\SONSTIGES\132490-9101-Sheet- 1.PDF"
Und das der Hauptpfad:
"\\SRV01\ORDERBASE ERP 3.0\DATENARCHIV SPEICHERORTE\SONSTIGES\"
also schon der größte Teil.
Würde heißen dann wäre ich kurz über 4000-5000 Zeichen bei 200 Zeilen.

Gruß quan81
Member: quan81
quan81 Oct 06, 2017 at 07:01:35 (UTC)
Goto Top
Hallo rubberman,
ich habe es jetzt mal getestet.
also es wird ein Syntaxfehler gemeldet und eine tmp.pdf erzeugt mit einem Teil der Daten.
Ich habe etwas weiter gespielt und habe beim move das /v entfehrt an beiden stellen!
Und jetzt klappt es wunder bar!?!?! Ich habe kleine Datensätze probiert und einen großen mit 247 Zeile hier wurde 4 mal die datei verschoben! und es klappt!!!
Ist das /v wichtig?

Gruß quan81
Member: rubberman
rubberman Oct 06, 2017 at 08:15:35 (UTC)
Goto Top
Sorry, das /v sollte ein /y werden. Hab's oben korrigiert.

Grüße
rubberman
Member: quan81
quan81 Oct 06, 2017 at 09:30:23 (UTC)
Goto Top
Hallo rubberman,
Super vielen vielen Danke und großes Lob an dich und an das Forum!
Es klappt wunderbar!
Ein Frage hätte ich da noch Sorry
Ich habe jetzt gerade gemerkt das ich hin und wieder mal ein ü ä ö ß im Dateinamen habe und dann das script aussteigt.
Muss ich damit leben weil dos damit nicht umgehen kann?

Gruß quan81
Member: quan81
quan81 Oct 06, 2017 at 09:51:03 (UTC)
Goto Top
Ich habe in zeile 2 folgendes eingefügt und es scheint zu klappen!
chcp 1252
Member: Biber
Biber Oct 06, 2017 updated at 10:15:29 (UTC)
Goto Top
Moin quan81,

der Vollständigkeit halber:
Hast du denn mal versucht, ob nicht ein einfacher Aufruf mit Wildcards auch zum Ziel führt?

Set "meinePDFs=\\SRV01\ORDERBASE ERP 3.0\DATENARCHIV SPEICHERORTE\SONSTIGES\*.pdf"  
"C:\PDFtkServer\bin\pdftk.exe" "%meinePDFs%" cat output "!fn!_tmp.pdf"   

Wäre doch schön, wenn pdftk Wildcards verarbeiten könnte und wenn doch eh' alle PDFs in dem Ordner zusammengedampft werden sollen...

Grüße
Biber
Member: quan81
quan81 Oct 06, 2017 at 10:29:17 (UTC)
Goto Top
Hallo Biber,
habe mal ausprobiert! Leider geht das nicht!