2012-05-18 41 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的原因。 –