texmex
Goto Top

Word- und PDF-Dokumente und Excel-Tabellen via Batch drucken?

Hallo!

Ich möchte mithilfe einer Batch-Datei wie im Titel beschrieben verschiedene Datei-Formate ausdrucken lassen. Doch es will nicht so ganz funktionieren...

Ich habe mir mithilfe einiger hier geschilderter Tipps für den Druck von Word-Dokumenten eine Batch-Datei geschrieben, die auf die Lösungsansätze aus diesem Thread basieren.

Doch leider wirft das Programm bei mir nur eine Fehlermeldung aus (Kompilierungsfehler). Zudem kann ich auch nicht auf den LPT1-Trick zurückgreifen, da der Drucker über den USB-Port angeschlossen worden ist und ich auch keine Veränderungen am bestehenden System vornehmen kann, weil es nicht mein eigener Rechner ist (damit fällt die Installation von Zusatzsoftware leider auch weg.)

Also, was ich ganz allgemein mit der Batch-Datei erreichen möchte:

In einem Ordner (hier: resources/00001234/ ), den der User zuvor durch eine simple Abfrage selbst raussucht, sind verschiedene Dateien, die die Stapelverarbeitung alle ausdrucken soll.

Mit dem print-Befehl kommt dabei nur die Anzeige, dass gedruckt wird. Auf diese ganze Geschichte mit LPT1 kann ich wie oben geschildert auch nicht zurückgreifen.

Notepad /p test.txt

Dieser Code funktioniert leider auch nur bei Text-Dokumenten, bei allen anderen Formaten bekomme ich logischerweise nur lauter Müll.

Gibt es da eventuell eine - für die drei genannten Formate - universelle Lösung, die im besten Fall auch nicht auf externe Dateien zurückgreift.

Und noch eine kurze Frage, die nicht direkt mit dem Thema selbst zu tun hat, aber ich stelle sie dennoch hier, da ich nicht extra einen Thread dafür eröffnen möchte:
Gibt es eine include-Funktion in Batch-Dateien? Ich habe schon danach gesucht, aber leider nichts vernünftiges finden können.

Den Befehl kenne ich nämlich aus PHP und damit könnte ich nämlich problemlos das Batch selbst mit einer anderen integrierten Batchfile bearbeiten, da ich dann die einzelnen Bestandteile der ersten Batch in Text-Dateien auslasten könnte.

Content-ID: 169170

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

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

bastla
bastla 05.07.2011 um 20:56:24 Uhr
Goto Top
Hallo TexMex und willkommen im Forum!

Im angesprochenen Thread hatte ich eine VBS-Variante "PrintAllDocs.vbs" verbrochen, die angepasst auf Deine Anforderung etwa so aussehen würde:
'PrintCertainFiles.vbs  
sSourceFolder = "D:\resources\00001234" ' Standard-Ordner; kann durch Übergabe eines Ordners als Parameter ersetzt werden  
sDateitypen = "#doc#docx#pdf#xls#xlsx#" ' zu verarbeitende Dateitypen - bitte nur in Kleinbuchstaben  
iWartezeit = 5 'Pause in Sekunden bis zur Verarbeitung der nächsten Datei  

If WScript.Arguments.Count > 0 Then
    sSourceFolder = WScript.Arguments(0)
End If
Set fso = CreateObject("Scripting.FileSystemObject")  
If sSourceFolder = "" Or Not fso.FolderExists(sSourceFolder) Then  
    WScript.Echo "Ordner """ & sSourceFolder & """ nicht verfügbar!"  
    WScript.Quit(2)
Else
    Set oShellApp = WScript.CreateObject("Shell.Application")  
    For Each oFile In fso.GetFolder(sSourceFolder).Files
        If InStr(sDateitypen, "#" & LCase(fso.GetExtensionName(oFile.Name)) & "#") > 0 Then  
            oShellApp.ShellExecute oFile.Path, "", "", "print", 0  
            bPrinted = True
            WScript.Sleep(1000 * iWartezeit)
        End If
    Next
    Set oShellApp = Nothing
    If Not bPrinted Then
        WScript.Echo "Kein Dokument zum Drucken gefunden!"  
        WScript.Quit(1)
    End If
End If
Im Prinzip wird hier für jede Datei, sofern sie den vorgegebenen Typen (siehe Zeile 3) entspricht, die Auswahl von "Drucken" im Kontextmenü des Explorers "simuliert" ...
Zu Deiner "Batch"-Frage: Ein Batch kann einen anderen Batch per "call" aufrufen - ein unmittelbares "Include" gibt es aber leider nicht.

Grüße
bastla
mathe172
mathe172 05.07.2011 um 23:31:01 Uhr
Goto Top
Hallo,

zu deiner zweiten Frage:

wenn du eine zweite Batch hast, in der genau eine Funktion enthalten ist, kannst du diese per "call" wie ein Unterprogramm ausführen.

Wenn du wirklich ein Include willst, versuch folgendes:
if exist "Temp.bat" (  
copy "Temp.bat"+"%~1" "Temp.bat"  
) else (
>"Temp.bat" more +%~2 "%~1"  
)
Ist noch nicht perfekt-aber wenn du das in eine Include.bat speicherst, und dann die Originaldatei so beginnst könnte es ein Schritt in die gewünschte Richtung sein.
rem Die 6 steht für die Anzahl Zeilen in dieser Datei, die ausgelassen werden sollen
2>nul del "Temp.bat"  
@call include "%~0" 6  
@call include "Bsp.txt"  
start "Temp.bat"  
goto :eof
call :Ordner

Zuerst muss die Datei selbst eingebunden werden, jedoch ohne den ersten Zeilen, da stehen ja die Includebefehle.
Danach wird die Bsp.txt eingebunden, die könnte so ausschauen:
:Ordner
cd
pause
Nun wird die Temp.bat gestartet und die Batch verlassen. Alles was jetzt kommt wird dann in der Temp.bat ausgeführt. Hier also:
call :Ordner
cd
pause

MfG,
Mathe172
Jochem
Jochem 06.07.2011 um 07:39:00 Uhr
Goto Top
Moin,

Zudem kann ich auch nicht auf den LPT1-Trick zurückgreifen, da der Drucker über den USB-Port angeschlossen worden ist und ich auch keine Veränderungen am bestehenden System > vornehmen kann....

Wer hindert Dich daran, für den über USB angeschlossenen Drucker eine Freigabe zu erstellen und den so freigegebenen Drucker per "net use"-Befehl an LPT1 zu hängen?

Gruß J face-smile chem
TexMex
TexMex 06.07.2011 um 17:02:17 Uhr
Goto Top
Das Script hat funktioniert! face-smile
Aber ich habe dazu noch eine Frage:
Kann ich als Verzeichnis in dem VBScript auch eine Variabel aus der Batch-Datei nehmen oder ist das nicht möglich?

Den Trick mit dem Include werde ich bei Gelegenheit ausprobieren, klingt auf jeden Fall sehr gut.
bastla
bastla 06.07.2011 um 17:42:32 Uhr
Goto Top
Hallo TexMex!

Da, wie erwähnt, das Script auch einen Parameter übernimmt, kannst Du es einfach per
C:\Scripts\PrintCertainFiles.vbs "D:\Dein anderes Verzeichnis"
aufrufen - auf Wunsch auch per
cscript //nologo C:\Scripts\PrintCertainFiles.vbs "D:\Dein anderes Verzeichnis"
in der Konsolenversion ...

Außerdem werden Errorlevel zurückgegeben - siehe dazu die jeweiligen "WScrpit.Quit()"-Zeilen.

Grüße
bastla
TexMex
TexMex 07.07.2011 um 16:44:20 Uhr
Goto Top
Zitat von @bastla:
auf Wunsch auch per
cscript //nologo C:\Scripts\PrintCertainFiles.vbs "D:\Dein anderes Verzeichnis"
> 
in der Konsolenversion ...

Außerdem werden Errorlevel zurückgegeben - siehe dazu die jeweiligen "WScrpit.Quit()"-Zeilen.

Grüße
bastla

Hallo bastla!

Erstmal nochmals ein großes Danke an dich für dieses tolle Skript. Es funktioniert jetzt tadellos, leider habe ich noch ein kleines Problem in der Batch-Datei selbst, denn nachdem das VBScript gestartet wird, beendet sich meine Batch - genau das sollte es aber eigentlich nicht machen. Ich hab's dann via "Call"-Befehl ausprobiert, weil dadurch die Stapelverarbeitung eigentlich weiterlaufen sollte, aber auch hier wird das Programm nur beendet.

Ich habe dann ein paar Seiten durchforstet, dort stand dann etwas von WBScript und dass ich es über
wscript //b C:\Scripts\PrintCertainFiles.vbs "D:\Mein Verzeichnis"
aufrufen solle, aber das hat auch wieder nichts geändert.

Zitat von @Jochem:
Moin,

Wer hindert Dich daran, für den über USB angeschlossenen Drucker eine Freigabe zu erstellen und den so freigegebenen
Drucker per "net use"-Befehl an LPT1 zu hängen?

Gruß J face-smile chem

Hey Jochem!

Wie oben schon geschildert, handelt es sich bei dem Rechner nicht um meinen eigenen PC, sondern um einen Firmen-Rechner, bei dem ich nicht die vollen Zugriffsrechte habe. Mit diesem kleinen Script möchte ich einfach nur mir und meinen Kollegen einen ganzen Haufen Arbeit ersparen. face-wink
bastla
bastla 07.07.2011 um 16:57:42 Uhr
Goto Top
Hallo TexMex!

Eigentlich sollte der Batch auf das Ende des Scripts warten ...

... anyhow - versuch es so:
start "Drucken ..." /wait cscript //nologo C:\Scripts\PrintCertainFiles.vbs "D:\Dein anderes Verzeichnis"
Grüße
bastla
TexMex
TexMex 09.07.2011 um 13:04:33 Uhr
Goto Top
Damit hat es leider auch nicht funktioniert, ich habe einfach eine neue Batch-Datei mit der entsprechenden Zeile für das CScript erstellt und diese dann via "Call-Befehl" ausgeführt. Das ist wohl nicht optimal, aber es funktioniert dann zumindest ohne Probleme. face-smile