我試圖使用PowerShell自動化Windows服務部署。我遇到的問題是停止當前版本並將其刪除。流程被分配後,DLL仍然被鎖定
因爲它是一個CI代理我不在乎在所有關於正確停止服務,所以我只是用taskkill /f /im:<exe name>
殺死進程。然後我嘗試刪除的文件和一個約3倍我得到這個:
Exception: Access to the path 'C:\Program Files (x86)\MirrorService\AWSSDK.dll' is denied.
但DLL只能由我剛殺的過程中使用。我試圖捕捉異常並記錄handle.exe
輸出。日誌中沒有這個DLL的句柄,我可以刪除它。
所以,很明顯有taskkill
之間存在滯後完成其工作,並處理釋放。什麼是最乾淨的等待方式?以下是我想出了這麼遠,沒有它看起來乾淨夠我:暫停後taskkill
和rm
rm
之間
- 地方的延遲(多久?)
- 使用
handle.exe
/解鎖釋放的DLL
PS:我已經試過了更好的方式與stop-service
和wait-process
和停止服務結果是相同的。
UPD:在停止服務和刪除它的文件之間放置300毫秒的延遲似乎有竅門,但我仍在尋找(1)解釋行爲和(2)更可靠的方法來確保dll被釋放。
你有沒有試圖消除'/ F'?你正在告訴過程被強制終止,而不是讓它有時間清理。 – Matt 2014-10-19 15:53:32
@Matt感謝您的想法。但是沒有運氣:'具有PID 10944的進程「Much.Stoppy.exe」無法終止。'# – vorou 2014-10-20 02:42:21
'Stop-Service'不等待服務停止。你是否從'Wait-Process'中得到了非終止錯誤,或者是否聲稱過程已經結束? (如果在進程退出前返回Wait-Process,我不會感到驚訝) – jpmc26 2017-04-25 21:02:50