无法将VBS作为批处理或计划任务运行

时间:2016-08-25 12:09:08

标签: batch-file vbscript

我有一个VBS,可以将一组文件打印到PDF。手动运行VBS时工作正常,但尝试通过批处理或计划任务执行时,它不起作用。我尝试了以下内容。

批处理文件:

C:\APPS\TEMP\example.vbs

结果:

enter image description here

批处理文件:

%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或安全问题。

2 个答案:

答案 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(".")

生成当前工作目录的路径,但是在计划任务中可能与您期望的不同,除非您在任务属性中明确定义工作目录。