2016-08-25 4 views
2

Ich habe eine VBS, die eine Reihe von Dateien in PDF druckt. Funktioniert einwandfrei, wenn VBS manuell ausgeführt wird, aber wenn versucht wird, entweder über Batch oder Geplante Task auszuführen, funktioniert es nicht. Ich habe folgendes versucht.Kann VBS nicht als Batch oder geplante Aufgabe ausführen

Batch File:

C:\APPS\TEMP\example.vbs 

Ergebnis:

enter image description here

Batch File:

%windir%\syswow64\cscript //nologo C:\APPS\TEMP\example.vbs 

gleiche Ergebnis wie Bild oben gezeigt.

VBS-Code:

Set fso = CreateObject("Scripting.FileSystemObject") 
currentdir = fso.GetAbsolutePathName(".") 

Set xmldom = CreateObject("MSXML.DOMDocument") 
xmldom.Load(currentdir & "\info.xml") 

progid = xmldom.SelectSingleNode("/xml/progid").text 

Set obj = CreateObject(progid) 

printername = obj.GetPrinterName 

runonce = obj.GetSettingsFileName(True) 

Set fldr = fso.GetFolder(currentdir & "\in") 
cnt = 0 
For Each f In fldr.files 
    cnt = cnt + 1 
    output = currentdir & "\out\" & Replace(f.name, ".xls", "") & ".pdf" 

    obj.Init 
    obj.SetValue "Output", output 
    obj.SetValue "ShowSettings", "never" 
    obj.SetValue "ShowPDF", "no" 
    obj.SetValue "ShowProgress", "no" 
    obj.SetValue "ShowProgressFinished", "no" 
    obj.SetValue "SuppressErrors", "yes" 
    obj.SetValue "ConfirmOverwrite", "no" 

    obj.WriteSettings True 

    printfile = currentdir & "\in\" & f.Name 
    cmd = """" & currentdir & "\printto.exe"" """ & printfile & """ """ & printername & """" 

    Set WshShell = WScript.CreateObject("WScript.Shell") 
    ret = WshShell.Run(cmd, 1, True) 

    While fso.fileexists(runonce) 
    WScript.Sleep 100 
    Wend 
Next 

Set obj = Nothing 

WScript.Echo cnt & " documents were printed." 

Um es zu bekommen manuell ausführen musste ich für VBS 32-Bit-cscript.exe als Standardprogramm einzustellen. In meinen Augen sollte der Batch-Code, der zuerst auf den VBS verweist, funktionieren, aber ich bin mir nicht sicher, warum das nicht der Fall ist. Dies in einem Windows Server 2008 R2-System. Versuchen Sie es auch auf einer Windows 7 x64-Box, um alle ungeraden GPO- oder Sicherheitsprobleme zu beseitigen.

+0

Verwenden Sie beim Ausführen des Skripts erhöhte Berechtigungen? – Lankymart

+1

Wussten Sie, dass Sie aus dem cmd-Fenster kopieren und einfügen können? – Squashman

Antwort

2

fein funktioniert, wenn die VBS läuft manuell

Nehmen wir an, Ihr info.xml im selben Verzeichnis wie die Skriptdatei C:\APPS\TEMP\info.xml befindet.

fso.GetAbsolutePathName(".") gibt Ihnen das aktuelle, standardmäßig Startverzeichnis. Es entspricht genau dem Ausführen von CD . an einer Eingabeaufforderung.

Ihr Skript funktioniert, wenn Sie mit einem Doppelklick starten, da es vom übergeordneten Ordner startet.

Es funktioniert jedoch nicht, wenn Sie von C:\APPS10 wie in dem Bild, das Sie anzeigen, oder als ein Taskbefehl ohne Startverzeichniskonfiguration starten. Ein Task-Befehl beginnt mit dem Home-Verzeichnis des Benutzers, üblicherweise %windir%\system32, wenn Sie die Konfiguration von start in directory ablehnen. Die Datei info.xml kann nicht gefunden werden, so dass die Methode SelectSingleNode fehlgeschlagen ist.

Ich würde Ihnen empfehlen, info.xml zu finden, indem Sie den vollständigen Pfad des Skripts anstelle von fso.GetAbsolutePathName(".") verwenden.

currentdir = fso.BuildPath(fso.GetParentFolderName(WScript.ScriptFullName), "info.xml") 
+0

Vielen Dank für den Hinweis. Dies half, die Batchdatei manuell auszuführen, aber ich kann immer noch nicht als geplante Aufgabe ausgeführt werden. –

+1

Die vorgenommene Änderung zusammen mit dem Hinzufügen des Pfads des VBS zum Feld "Start In" des geplanten Tasks hat es funktioniert. Danke nochmal für die Hilfe. –

1

Beim Laden der XML-Daten ist vermutlich ein Fehler aufgetreten. Fügen Sie Code ein, um nach dem Laden der Datei nach Parserfehlern zu suchen. Weisen Sie den Parser außerdem an, synchron zu arbeiten, damit Sie nicht versuchen, etwas zu tun, wenn die vorherige Operation noch nicht abgeschlossen ist.

xmldom.Async = False 
xmldom.Load(currentdir & "\info.xml") 

If xmldom.ParseError.ErrorCode <> 0 Then WScript.Echo xmldom.ParseError.Reason WScript.Quit xmldom.ParseError.ErrorCode End If 

progid = xmldom.SelectSingleNode("/xml/progid").text

Stellen Sie außerdem sicher, dass die Datei, die Sie lesen möchten, genau dort ist, wo Sie es erwarten. Die Aussage

currentdir = fso.GetAbsolutePathName(".") 

erzeugt den Pfad zum aktuellen Arbeitsverzeichnis, sondern in einer geplanten Aufgabe, die unterschiedlich sein kann von dem, was Sie erwarten, wenn Sie nicht ausdrücklich ein Arbeitsverzeichnis in den Aufgabeneigenschaften definieren.

+1

Das Ergebnis der Abfrage sollte ebenfalls überprüft werden. –

Verwandte Themen