1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[batch] 2 For-Schleifen wechselseitig

Dieses Thema im Forum "Sonstige Sprachen" wurde erstellt von amn.ssy, 24. Oktober 2013.

  1. amn.ssy

    amn.ssy Erfahrenes Mitglied

    Hallo,

    ich steh grade ziemlich auf der Leitung hinsichtlich der wechselseitigen abarbeitung 2er For-Schleifen :(
    Hintergrund: Das nachfolgende VBS merged PDF-Dateien. Dabei wird aus dem Verzeichnis "A" von der Datei "1" die letzte Seite entfernt und durch die Datei "2" (besteht nur aus einer Seite) ersetzt. Datei "2" liegt im Verzeichnis "B".

    VBS:
    Code (Visual Basic):
    1. 'InFile1 = WScript.Arguments(0)
    2. 'InFile2 = WScript.Arguments(1)
    3. 'OutFile = WScript.Arguments(2)
    4.  
    5.  
    6. Set App = CreateObject("AcroExch.App")
    7. Set AVDoc = CreateObject("AcroExch.AVDoc")
    8.  
    9. Set baseDoc = CreateObject("AcroExch.PDDoc")
    10. Set insertDoc = CreateObject("AcroExch.PDDoc")
    11.    
    12. srcPath = "C:\PrintSplitMerge\Reports\TM August 2013.pdf" 'kann raus
    13. srcPath2 = "C:\PrintSplitMerge\SignPg\SignPage_001.pdf" 'kann raus
    14. destPath = "C:\PrintSplitMerge\Reports\TM August 2013_FINAL.pdf" 'kann raus
    15.    
    16. baseDoc.Open srcPath '<- InFile1
    17. endPage = baseDoc.GetNumPages() - 1
    18. insertDoc.Open srcPath2 '<- InFile2
    19.  
    20.  
    21. baseDoc.ReplacePages endPage, insertDoc, 0, insertDoc.GetNumPages(), 0
    22.        
    23. baseDoc.Save &H1, destPath '<- OutFile
    24.    
    25. App.CloseAllDocs
    26. App.Exit
    27.  
    28. Set insertDoc = Nothing
    29. Set baseDoc = Nothing
    30. Set AVDoc = Nothing
    31. Set App = Nothing
    32.  
    33. Wscript.Quit(0)
    In dieser Fassung, in der ich testhalber die Dateien und den "Output" vorgebe funktioniert das ganz so wie es soll!

    Ich möchte nun mittels einer Batch die Verzeichnisse "A" und "B" wechselseitig durchlaufen und die jeweiligen Dateien dem VBS übergeben (also im 1. Lauf die jeweils 1. Datei aus dem Verzeichnis "A" und "B", im 2. Lauf die jeweils 2. Datei, im 3. die jeweils 3. Dateien, usw. bis alle abgearbeitet sind).
    Wie müßen die beiden Schleifen korrekterweise aussehen um dies zu realisieren?
    Ich habe das folgende versucht, jedoch nicht mit dem gewünschten Ergebnis, da ja logischerweise die innere Schleife komplett durchlaufen wird.
    Irgendwie müßte da m.E. ein Zähler o.ä. rein(?)

    Batch:
    Code (Text):
    1. @echo off & setlocal enableDelayedExpansion
    2.  
    3. set root=%~dp0
    4. set inp=%~dp0input\
    5. set pro=%~dp0prog\
    6. set rep=%~dp0reports\
    7. set sig=%~dp0signpg\
    8. set wks=%~dp0temp\
    9.  
    10. for %%f in (%rep%*.pdf) do (
    11.     for %%g in (%sig%*.pdf) do cscript //nologo "%pro%replacePages0.vbs" "%%f" "%%g"
    12. )
    Da in "%%f" ja der komplette Pfad incl. Dateiname steht und dieser sich später nur durch _FINAL ändert, würde mich noch interessieren wie ich diesen so auseinanderpflücken bzw. zusammensetzen kann, damit ich mir im VBScript (durch einen 3. Parameter) auch die Hardcodierung von "destpath" ersparen kann?

    Grüße
    OpiWahn

    P.S. Ein funktionierendes VBscript zum Splitten von PDF-Dateien habe ich bereits erfolgreich an Bord - damit werden die Dateien im Verzeichnis "B" erzeugt :)
     
    Zuletzt bearbeitet: 24. Oktober 2013
  2. deepthroat

    deepthroat Erfahrenes Mitglied

    Hi.

    Warum willst du das denn in Batch machen, wenn du ohnehin schon VBScript einsetzt?

    Es ist vor allem fraglich ob die Dateiliste welche die for-Schleife liefert sortiert ist und überhaupt direkt für die Zuordnung (Datei1.1 => Datei2.1) genutzt werden kann. Du müßtest soetwas wie "dir /b" verwenden um das zu realisieren.

    Nimm einfach ein FilesystemObject in VBScript und ermittele die Dateien aus den Verzeichnissen.
    Filtere alle *.pdf Dateien aus den zwei Listen und sortiere die Dateiliste nach Namen, wenn du nicht sogar den Namen generieren kannst. (SignPage_001.pdf, SignPage_002.pdf, SignPage_003.pdf usw.)
     
  3. amn.ssy

    amn.ssy Erfahrenes Mitglied

    Hallo deepthroat,

    die Zuordnung bzw. Sortierung sollte kein Problem darstellen, da die Dateien in der die Seiten ausgetauscht werden sollen (Verzeichnis A) Ziffern beinhalten und daher sortiert sind.
    Bei den einseitigen Dateien (Verzeichnis B) sorge ich bereits für ein entsprechende Ausgabe wie du sie auch oben beschrieben hast.
    Der Code zum Splitten sieht so aus:
    Code (Visual Basic):
    1. InFile = Wscript.Arguments(0)
    2.  
    3. Set App = CreateObject("Acroexch.app")
    4. Set AVDoc = CreateObject("AcroExch.AVDoc")
    5.  
    6. If (AVDoc.Open(InFile, InFile)) Then
    7.   Set AVPageView = AVDoc.GetAVPageView
    8.   Set PDDoc = AVDoc.GetPDDoc()
    9.   Set JSO = PDDoc.GetJSObject
    10.  
    11.   for x = 0 to JSO.numPages - 1
    12.     NewFile = "C:\PrintSplitMerge\SignPg\SignPage" & "_" & right(x + 1001,3) &".pdf"
    13.     JSO.extractPages x, x, NewFile
    14.   next
    15. end if
    16.  
    17. App.CloseAllDocs
    18. App.Exit
    19.  
    20. Set JSO = Nothing
    21. Set PDDoc = Nothing
    22. Set AVDoc = Nothing
    23. Set App = Nothing
    24.  
    25. Wscript.Quit(0)
    Batch
    Code (Text):
    1. @echo off & setlocal enableDelayedExpansion
    2.  
    3. set root=%~dp0
    4. set inp=%~dp0input\
    5. set pro=%~dp0prog\
    6. set rep=%~dp0reports\
    7. set sig=%~dp0signpg\
    8. set wks=%~dp0temp\
    9.  
    10. for %%f in (%inp%*.pdf) do (
    11.     cscript //nologo "%pro%extractPages.vbs" "%%f" & move "%%f" %wks%
    12. )
    Wäre natürlich schon schick wenn beides zusammenlaufen würde.
    Da ich nicht gerade der Coder bin habe ich mir die Scripte ziemlich mühsam aus dem Netz gezogen und entsprechend modifiziert.
    Zum Thema Acrobat über VBS ansteuern gibt es zwar das eine oder andere an Referenzliteratur, aber kaum bereits umgesetzte Beispiele für ein "replace".
    Ich bin davon ausgegangen, daß ich mehere Dateien nur dann verarbeiten kann wenn ich via Batch die Parameter dem Script übergebe.

    Sinn der Übung ist, daß mir zunächst die Reports im Verzeichnis A ohne Unterschriften auf der jeweils letzten Seite vorliegen.
    Diese Seiten drucke ich hiermit aus:
    Code (Visual Basic):
    1. InFile = Wscript.Arguments(0)
    2.  
    3. Set App = CreateObject("AcroExch.App")
    4. Set AVDoc = CreateObject("AcroExch.AVDoc")
    5.  
    6. AVDoc.Open InFile,""
    7. Set PDDoc = AVDoc.GetPDDoc
    8. Set JSO = PDDoc.GetJSObject
    9.  
    10. '//JSO.print("bUI","nStart","nEnd","bSilent","bShrinkToFit","bPrintAsImage","bReverse","bAnnot","bprintParams")
    11.  
    12. endPage = jso.numPages-1
    13. startPage = endPage
    14. Set pp = JSO.getPrintParams()
    15. pp.printerName = "Print2Me PCL6 Color"
    16. JSO.print False,startPage,endPage,False,True,False,False,False,pp
    17.  
    18. App.CloseAllDocs
    19. App.Exit
    20.  
    21. Set JSO = Nothing
    22. Set PDDoc = Nothing
    23. Set AVDoc = Nothing
    24. Set App = Nothing
    25.  
    26. Wscript.Quit(0
    Batch
    Code (Text):
    1. @echo off & setlocal enableDelayedExpansion
    2.  
    3. set root=%~dp0
    4. set inp=%~dp0input\
    5. set pro=%~dp0prog\
    6. set rep=%~dp0reports\
    7. set sig=%~dp0signpg\
    8. set wks=%~dp0temp\
    9.  
    10. for %%f in (%rep%*.pdf) do (
    11.     cscript //nologo "%pro%printPages.vbs" "%%f"
    12. )
    Nach dem diese Seiten unterschieben sind werden Sie eingescannt (idealerweise in Reihenfolge)und kommen als einzige PDF-Datei bei mir an. Für die folgenden Schritte, die ich gerne automatisieren würde dienen dann das Splitten- und anschließend das Replace-Script.

    Gruß
    OpiWahn
     
  4. deepthroat

    deepthroat Erfahrenes Mitglied

    Es steht nirgendwo in welcher Reihenfolge for die Dateien liefert. Das deine Dateinamen einen bestimmen Aufbau haben ermöglicht lediglich das man sie sortieren kann, aber es ist nicht garantiert das for (bzw. die Wildcard Expansion) dies auch tut...

    Wenn deine Dateien aus Verzeichnis B durchnummeriert sind, kannst du natürlich auch einfach eine Schleife über die Dateien aus Verzeichnis A machen und dann einen Zähler hochzählen und den Dateinamen generieren.
    Code (Text):
    1. set c=1
    2.  
    3. for .. do (
    4.   set num=00!c!
    5.   set nameB=SignPage_!num:~-3!.pdf
    6.  
    7.   echo !nameB!
    8.  
    9.   set /a c+=1
    10. )
     
Die Seite wird geladen...