2009-11-10 31 views
4

我有一個引導程序應用程序,它安裝了幾個MSI軟件包。但是,如果安裝失敗,Windows安裝程序似乎不會返回任何錯誤代碼。例如,下面的命令行測試不打印「失敗」如果我打「取消」:安裝MSI時,如何以編程方式檢測成功或失敗?

msiexec /i myinstaller.msi || echo failed 

由於缺乏誤差反饋,什麼是檢測安裝失敗的最好方法?


正如接受的答案所暗示的,實際上返回了錯誤代碼。出於某種原因,我的測試用例只能在從批處理文件執行時按預期工作,而不是直接在命令行輸入。

+1

+1解釋爲什麼你的測試用例沒有工作。 – Heinzi 2009-11-10 16:56:08

+0

你的測試用例和批處理文件都需要使用'call msiexec ||回聲失敗'。 (necro,fwiw等:) – azhrei 2013-08-12 03:28:53

回答

4

實際上,msiexec確實返回錯誤代碼,兩個成功代碼爲0(成功)和3010(成功,需要重新啓動)。也許cmd.exe在你的例子中做了一些不想要的魔法(就像在msiexec完成之前返回),但是當通過VBScript的WScript.Shell Run(帶有bWaitOnReturn = True)執行它時,我成功讀取了msiexec錯誤代碼。

嘗試扔在一個test.vbs文件下面,然後用cscript test.vbs執行它:

Set WshShell = WScript.CreateObject("WScript.Shell") 
MsgBox(WshShell.Run("msiexec /i myinstaller.msi", , true)) 

應該彈出一個非零值,如果你擊中取消。

3

如果您點擊取消,它不是錯誤,安裝程序正在執行請求的操作,並且很可能會將0返回到取消功能。

2

由於Windows安裝程序1.0是首次發佈,msiexec.exe的一貫 在Windows子系統運行。這意味着當它從 執行時,控制檯或批處理腳本控制立即返回到控制檯或 腳本。如果你依賴於%ERRORLEVEL%變量被設置爲 ,它將不會。

在這種情況下,我喜歡使用start /wait命令行或 批處理腳本。這將創建該進程並等待它退出, 並且來自該進程的返回代碼被傳遞並從開始命令返回 ,從而相應地設置%ERRORLEVEL%。在命令行之前剛剛 型start /wait你通常傳遞給 msiexec.exe的像下面的例子:

start /wait msiexec.exe /i netfx.msi /l*v netfx.log

批處理腳本將被阻止,那麼,直到完成msiexec.exe的。 以編程方式,這與調用msiexec.exe和 CreateProcess並且正在等待進程句柄用 WaitForSingleObject沒有超時信號發送沒有什麼不同。

來源:https://blogs.msdn.microsoft.com/heaths/2005/11/15/waiting-for-msiexec-exe-to-finish/

示例代碼:

start /wait msiexec.exe /i netfx.msi /l*v netfx.log 

if "%errorlevel%" == "0" goto OK 
if "%errorlevel%" == "1013" goto err 
if "%errorlevel%" == "1603" goto err 
if not "%errorlevel%" == "0" goto err 

:OK 
GOTO END 

:err 
rem print message and return errorlevel so package errors 
echo "Error: Msiexec failed with errorlevel = %errorlevel%" 
exit /b %errorlevel% 

:END 

碼參考:https://www.computing.net/answers/windows-xp/batch-file-to-install-msi-and-check-errorlvl/178657.html

相關問題