2011-08-04 84 views
4

我有一個批處理文件,它在啓動後立即存在(作爲管理員運行)並且不執行其中的命令,但是如果我在命令行中指定它,行,它運行良好並執行所有命令。Windows批處理文件不會等待命令完成

下面是在它:

start /wait msiexec /x SetupServices.msi /qn /l* "SetupServices.uninstall.log" 

start /wait msiexec /i SetupServices.msi /qn /l* "SetupServices.install.log" 

回答

8

(更正答案)

首先,如果你在一個批處理啓動.exe文件,它是安全的,與「呼」前綴它。 有時這需要確保批次正在等待完成。

使用「開始」是另一種可能性,但對於這種簡單的用例不是必需的。

你寫的命令是而不是執行。所以,顯然,你有另一個問題,而不是「不等待......完成」的問題。 看一下你提供的新例子,就是這樣。在管理模式下,您必須提供完整路徑。使用下面的小技巧(「%〜dp0」,包括已經是反斜槓),仍然可以在批處理文件中使用當前目錄。

大多數時候,如果管理員權限出現這樣的問題,這是「當前目錄」路徑的問題。一個帶有管理權限的批處理文件並沒有像我們習慣的那樣使用它,它並不在它自己的目錄中啓動(但主要在System32中)。不依賴於CD是編寫防彈批處理文件的重要內容。

一個很好的例子批次,這裏結合其他的答案,並在你的情況下,解決了一些可能的問題是:

call msiexec /i "%~dp0MySetup.msi" /qb /L*v "%~dp0MySetup.log" 
echo Returncode: %ERRORLEVEL% 
pause 

它正確地使用當前目錄,並假定一個安裝的命令行包括日誌文件(作品只有當您在當前目錄中有寫入權限時,如果未指定具有寫入權限的日誌文件的路徑,例如「%TEMP%\ MySetup.log」。

注意:切記要真正開始具有管理權限的批處理文件(右鍵菜單或打開管理命令外殼之前:)

+0

謝謝,所有你寫了真正的幫助我! – s0nica

+1

受歡迎。我想引導感興趣的讀者到我的「第二個」答案的下面,以及創建一個批處理文件的相關技巧(重新)自動啓動管理員權限(UAC)沒有,用戶(通常沒有經驗)需要「開始作爲管理員」左右:http://stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights/14729312#14729312這與這裏的問題有關,因爲顯然,設置需要管理員權限和概率lem包含兩個子問題。 – Philm

1

嘗試採取啓動/等待出的MSIEXEC行,如果不行再創建兩個BAT文件的一個叫uninstall.bat其他INSTALL.BAT和使用調用來串行執行它們。

+0

沒有章法我能做到這一點,但不應該有是更直接的方法? :-) – ostati

1

pause聲明添加到批處理結束時,這將防止控制檯窗口關閉,並且您將能夠看到錯誤消息(如果有)。錯誤可能是它沒有實際運行任何東西而退出的原因。它可能是什麼樣的錯誤? SetupServices.msi找不到 - 這就是我想到的。

+0

我以前做過,但這並沒有改變任何東西...... :( – ostati

+0

@Ostati你沒有看到任何錯誤嗎?也嘗試分析批處理中的%ERRORLEVEL%環境變量,增加'echo%ERRORLEVEL%'應該足夠了:0表示成功,其他退出代碼表示失敗,有一個[msiexec返回代碼]列表(http://msdn.microsoft.com/en-us/library/aa368542.aspx)。 –

1

它有點超出了問題的範圍,但是擴展了我對於處理當前目錄的回答:這裏是我推薦的開始批處理文件保存它自己的路徑。專業是它也適用於UNC路徑。如果有必要,「Pushd」會自動創建一個新的驅動器盤符(假設您有一個免費的盤符)。當然,你也可以立即在批處理文件的末尾使用「popd」,但是穩定的命令並不依賴於當前的目錄,所以最好總是提供完整的路徑。

@echo off 
cls 
pushd %~dp0 
popd 
set MYDIR=%CD% 
echo Directory of this batch fil: %MYDIR% 

然後,您可以從對方的回答中添加MSI線路是這樣的:

call msiexec /i "%MYDIR%\MySetup.msi" /qb /L*v "%MYDIR%\MySetup.log" 
echo Returncode: %ERRORLEVEL% 
pause 

(注:對於你當然是免費的日誌文件路徑,它不必是不一定在同一目錄下,但是對於測試/調試很有幫助,在任何情況下,你都必須擁有對MSI提供的目錄/文件的寫入權限。)

雖然對於普通的MSI文件,並不總是需要使用管理員啓動批處理從一開始的權利,這項技術遠遠更安全(開始MSI喜歡已經擁有管理員權限),而不是過分依賴MSI UAC(可能)。 它也適用於msiexec .../qn,這很重要(無提示安裝)。

+0

這是我的一個小東西,因爲我的第一個答案已經得到了一些關注(最近有3個ups :-),相比之下我的很多其他答案,其中一些真的很有效:-) – Philm

2

說回這個問題,我認爲「正確的方式」來做到這一點是通過PowerShell的

Start-Process -Wait -FilePath msiexec -ArgumentList /i, "setup.msi", /qn, /l*v, "install.log" 

沒有黑客和:-)