# [batch] 2 For-Schleifen wechselseitig



## amn.ssy (24. Oktober 2013)

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:

```
'InFile1 = WScript.Arguments(0)
'InFile2 = WScript.Arguments(1)
'OutFile = WScript.Arguments(2)


Set App = CreateObject("AcroExch.App")
Set AVDoc = CreateObject("AcroExch.AVDoc")

Set baseDoc = CreateObject("AcroExch.PDDoc") 
Set insertDoc = CreateObject("AcroExch.PDDoc")
    
srcPath = "C:\PrintSplitMerge\Reports\TM August 2013.pdf" 'kann raus
srcPath2 = "C:\PrintSplitMerge\SignPg\SignPage_001.pdf" 'kann raus
destPath = "C:\PrintSplitMerge\Reports\TM August 2013_FINAL.pdf" 'kann raus
    
baseDoc.Open srcPath '<- InFile1
endPage = baseDoc.GetNumPages() - 1 
insertDoc.Open srcPath2 '<- InFile2


baseDoc.ReplacePages endPage, insertDoc, 0, insertDoc.GetNumPages(), 0
        
baseDoc.Save &H1, destPath '<- OutFile
    
App.CloseAllDocs
App.Exit

Set insertDoc = Nothing 
Set baseDoc = Nothing 
Set AVDoc = Nothing 
Set App = Nothing

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:

```
@echo off & setlocal enableDelayedExpansion

set root=%~dp0
set inp=%~dp0input\
set pro=%~dp0prog\
set rep=%~dp0reports\
set sig=%~dp0signpg\
set wks=%~dp0temp\

for %%f in (%rep%*.pdf) do (
    for %%g in (%sig%*.pdf) do cscript //nologo "%pro%replacePages0.vbs" "%%f" "%%g"
)
```

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


----------



## deepthroat (24. Oktober 2013)

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


----------



## amn.ssy (24. Oktober 2013)

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:

```
InFile = Wscript.Arguments(0)

Set App = CreateObject("Acroexch.app") 
Set AVDoc = CreateObject("AcroExch.AVDoc") 

If (AVDoc.Open(InFile, InFile)) Then 
  Set AVPageView = AVDoc.GetAVPageView 
  Set PDDoc = AVDoc.GetPDDoc() 
  Set JSO = PDDoc.GetJSObject 

  for x = 0 to JSO.numPages - 1 
    NewFile = "C:\PrintSplitMerge\SignPg\SignPage" & "_" & right(x + 1001,3) &".pdf" 
    JSO.extractPages x, x, NewFile
  next 
end if 

App.CloseAllDocs
App.Exit

Set JSO = Nothing 
Set PDDoc = Nothing 
Set AVDoc = Nothing 
Set App = Nothing

Wscript.Quit(0)
```

Batch

```
@echo off & setlocal enableDelayedExpansion

set root=%~dp0
set inp=%~dp0input\
set pro=%~dp0prog\
set rep=%~dp0reports\
set sig=%~dp0signpg\
set wks=%~dp0temp\

for %%f in (%inp%*.pdf) do (
    cscript //nologo "%pro%extractPages.vbs" "%%f" & move "%%f" %wks%
)
```

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:

```
InFile = Wscript.Arguments(0)

Set App = CreateObject("AcroExch.App") 
Set AVDoc = CreateObject("AcroExch.AVDoc")

AVDoc.Open InFile,""
Set PDDoc = AVDoc.GetPDDoc
Set JSO = PDDoc.GetJSObject

'//JSO.print("bUI","nStart","nEnd","bSilent","bShrinkToFit","bPrintAsImage","bReverse","bAnnot","bprintParams")

endPage = jso.numPages-1
startPage = endPage 
Set pp = JSO.getPrintParams()
pp.printerName = "Print2Me PCL6 Color"
JSO.print False,startPage,endPage,False,True,False,False,False,pp

App.CloseAllDocs
App.Exit

Set JSO = Nothing 
Set PDDoc = Nothing 
Set AVDoc = Nothing 
Set App = Nothing

Wscript.Quit(0
```

Batch

```
@echo off & setlocal enableDelayedExpansion

set root=%~dp0
set inp=%~dp0input\
set pro=%~dp0prog\
set rep=%~dp0reports\
set sig=%~dp0signpg\
set wks=%~dp0temp\

for %%f in (%rep%*.pdf) do (
    cscript //nologo "%pro%printPages.vbs" "%%f"
)
```
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


----------



## deepthroat (24. Oktober 2013)

_opiWahn_ hat gesagt.:


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


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.

```
set c=1

for .. do (
  set num=00!c!
  set nameB=SignPage_!num:~-3!.pdf

  echo !nameB!

  set /a c+=1
)
```


----------

