2014-05-04 41 views
0

我對VBScript還不太瞭解,所以我可能犯了一些我只是看不到的菜鳥錯誤。 我基本上試圖做的是通過vbscript獲取MS Office 2013客戶端許可證信息的解決方法。 它將許可證信息從Office文件夾中的ospp.vbs文件轉儲到txt文件中。VBScript - 除非Wscript.Sleep無法訪問文本文件,即使文件已經可用

這裏是我的劇本的刪節部分,那就說明這個問題:

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objShell = Wscript.CreateObject("WScript.Shell") 
Dim IsThere 
If objFSO.fileExists("C:\Program Files\Microsoft Office\Office15\OSPP.VBS") Then 
      isThere = True 
      objShell.Run "cmd /K cscript ""C:\Program Files\Microsoft Office\Office15\OSPP.VBS"" /dstatus > C:\temp\tmpOutput.txt & exit" 
    ElseIf objFSO.fileExists("C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS") Then 
     isThere = True 
     objShell.Run "cmd /K cscript ""C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS"" /dstatus > C:\temp\tmpOutput.txt & exit" 
    End If 
    ' wait for ospp.vbs zu finish and create the temporary txt file with license information 
    Do While Not objFSO.fileExists("C:\temp\tmpOutput.txt") 
     Wscript.Sleep 10 
    Loop 
    If isThere = True AND objFSO.fileExists("C:\temp\tmpOutput.txt") Then 
    'Wscript.Sleep 4000 
     Dim listFile 
     listFile = objFSO.OpenTextFile("C:\temp\tmpOutput.txt").ReadAll 
     Wscript.Echo listFile 
    End If 
    ' Delete temporary data file 
    If objFSO.fileExists("C:\temp\tmpOutput.txt") Then 
     objFSO.deleteFile "C:\temp\tmpOutput.txt" 
    End If 

像這樣運行它引發錯誤輸入過去文件(800A003E)的末尾行:

listFile = objFSO.OpenTextFile("C:\temp\tmpOutput.txt").ReadAll 

如果我取消註釋Wscript.Sleep 4000,它工作正常,並顯示預期的結果。 即使我在Do-Loop中等待文件真正存在,它爲什麼會拋出錯誤?

+0

OSPP.VBS輸出將立即創建,但只有在進程終止時纔會關閉,文件存在本身並不意味着裏面有東西(或者它可用於讀取)。 –

回答

1

.Run該方法有一個參數

bWaitOnReturn

可選。指示在腳本中繼續執行下一個 語句之前,腳本是否應該等待程序 完成執行的布爾值。如果設置爲true,腳本執行將暫停,直到程序完成 ,並且Run返回 程序返回的任何錯誤代碼。如果設置爲false(默認值),Run方法在程序啓動後立即返回 ,自動返回0(不是 被解釋爲錯誤代碼)。

使用它可以確保tmpOutput.txt在.ReadAll()之前完全寫入並關閉。

未經測試的推測:錯誤「輸入過去的結束」意味着該文件存在(這就是你所檢查的),但沒有內容。

+0

非常感謝!我應該更徹底地閱讀文檔,我猜... – Cyrus