我有一个VBS,可以将一组文件打印到PDF。手动运行VBS时工作正常,但尝试通过批处理或计划任务执行时,它不起作用。我尝试了以下内容。
批处理文件:
C:\APPS\TEMP\example.vbs
结果:
批处理文件:
%windir%\syswow64\cscript //nologo C:\APPS\TEMP\example.vbs
与上面显示的图像相同。
VBS代码:
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."
为了让它手动运行,我必须将32位cscript.exe
设置为VBS的默认程序。所以在我看来,首先调用它们指向VBS的批处理代码应该可以工作,但我不确定为什么不是。这在Windows Server 2008 R2系统中。还在Windows 7 x64机器上试用它以消除任何奇怪的GPO或安全问题。
答案 0 :(得分:2)
手动运行VBS时工作正常
假设您的info.xml
与脚本文件C:\APPS\TEMP\info.xml
位于同一目录中。
fso.GetAbsolutePathName(".")
为您提供默认的启动目录。它与在命令提示符下运行CD .
完全相同。
当你通过双击运行时,你的脚本会起作用,因为它从它的父文件夹开始。
但是,当您从C:\APPS
开始时,如您显示的图像或没有启动目录配置的任务命令,它不起作用。当你解雇配置目录中的start时,任务命令从用户的主目录开始,通常是%windir%\system32
。
简而言之,无法找到文件info.xml
,因此方法SelectSingleNode
失败。
我建议您使用脚本的完整路径找到info.xml
,而不是fso.GetAbsolutePathName(".")
。
currentdir = fso.BuildPath(fso.GetParentFolderName(WScript.ScriptFullName), "info.xml")
答案 1 :(得分:1)
大概加载XML数据时出错。加载文件后插入代码以检查解析器错误。还要告诉解析器同步工作,这样当前一个操作还没有完成时你就不会尝试做某事。
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
还要确保您尝试阅读的文件是您期望的文件。声明
currentdir = fso.GetAbsolutePathName(".")
生成当前工作目录的路径,但是在计划任务中可能与您期望的不同,除非您在任务属性中明确定义工作目录。