2012-05-18 39 views
1

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

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(例如6613时的实际进程ID为8146)。 cscript主机似乎在Visio进程退出前导致清理临时文件时出现问题。

这里是将Visio参考笔记:

所以,问题是:我怎么能得到的Visio进程ID或当它正常退出检测?

谢谢!

+0

我有一个类似的问题,并解决它非常愚蠢的扫管笏。我叫pslist -t(sysinternals文书的一部分),并在wshost.exe下的名称进程sercs计数空间,看看它是否是一个子进程。如果你可以找到另一种方式 - 这也是一种方式:) – npocmaka

回答

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/Microsoft/Developing%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 
+0

我没有得到vbscript中的错误;我只需要知道Visio进程何时退出。目前在'visio.quit'和它实际退出之间存在竞争条件。 –

+0

我添加了一个示例脚本如何检查一个进程是否仍在运行,将其放置在一个循环中,以及服务何时停止执行清理并关闭 – peter

+0

问题是转换为PDF的过程发生在多个进程中所以当我试图清理当前的系统时,系统上可能会有另一个Visio进程处于活动状态。这就是为什么我渴望在vbscript中获得进程ID的原因。 –