2

我正在使用自动化运行 Visio,但无法获取 Visio 进程的进程 ID 以检查其何时完成。这是我的VB脚本:

Set visio = CreateObject("Visio.InvisibleApp")
Wscript.Echo visio.ProcessID    
Set document = visio.Documents.OpenEx("somefile.vsd", &H88)
document.ExportAsFixedFormat 1, "somefile.pdf", 1, 0
visio.Quit

并运行它cscript // nologo


问题是visio.ProcessID返回的数字不是实际的 Windows 进程 ID(例如,当实际进程 ID 为 8146 时为 6613)。cscript 主机似乎在 Visio 进程退出之前完成,导致清理临时文件出现问题。

以下是 Visio 参考说明:

所以问题是:如何获取 Visio 进程 ID 或检测它何时正确退出?

谢谢!

4

2 回答 2

1

刚刚在 Visio.Application.ProcessID 的帮助中注意到这一点:

“ProcessID 返回的值与当前 Visio 实例的 Windows 进程 ID 不同。”

所以我猜这些只是为了让您可以区分多个 Visio 实例。

还有 Visio.Application.WindowHandle32 和 Visio.Application.WindowHandle,它们可能会有所帮助,尽管对于不可见的应用程序实例可能没有那么多。

于 2020-03-12T09:41:09.913 回答
0

看不出这个 id 对你有什么帮助。我怀疑你在 visio 中遇到错误。你试过吗

on error resume next

并在每行可能给出错误之后

if err.number <> 0 then
  wscript.echo err.description
  err.clear
end if

如果省略参数似乎会出现问题,因此请全部使用它们。有关值,请参见http://msdn.microsoft.com/en-us/library/office/ms409271(v=office.12).aspx。在退出使用之前document.saved = true,您可以先检查结果文件是否存在。

编辑:检查进程是否正在运行,是否必须调整服务名称(检查您的 téaskmanager)

set service = GetObject ("winmgmts:")

for each Process in Service.InstancesOf ("Win32_Process")
  If lcase(Process.Name) = "visio.exe" then
    wscript.echo "visio still running"
    wscript.quit
  End If
next
wscript.echo "visio no longer running"

EDIT2:获取活动 visio 应用程序的 processid(如果运行多个 Visio 实例,则 GetObject 返回活动实例。当程序作为加载项运行或通过双击形状时,活动实例是运行程序的那个。否则,它是最近运行的实例或被带到前面的实例。如果没有 Visio 实例正在运行,GetObject 会导致错误)cfr http://webmail.vh.com.tw/微软/开发中%20Microsoft%20Visio%20Solutions/27.htm

set appObj = GetObject(, "visio.application")
if appObj Is Nothing Then
  wscript.echo "There is no active Visio."
else
  wscript.echo "ProcessID: " & appObj.ProcessID
end if
于 2012-08-05T22:14:52.587 回答