2014-10-19 42 views
2

我試圖使用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之間存在滯後完成其工作,並處理釋放。什麼是最乾淨的等待方式?以下是我想出了這麼遠,沒有它看起來乾淨夠我:暫停後taskkillrm

  • 捕獲異常,然後重試rm之間

    • 地方的延遲(多久?)
    • 使用handle.exe /解鎖釋放的DLL

    PS:我已經試過了更好的方式與stop-servicewait-process和停止服務結果是相同的

    UPD:在停止服務和刪除它的文件之間放置300毫秒的延遲似乎有竅門,但我仍在尋找(1)解釋行爲和(2)更可靠的方法來確保dll被釋放。

  • +2

    你有沒有試圖消除'/ F'?你正在告訴過程被強制終止,而不是讓它有時間清理。 – Matt 2014-10-19 15:53:32

    +0

    @Matt感謝您的想法。但是沒有運氣:'具有PID 10944的進程「Much.Stoppy.exe」無法終止。'# – vorou 2014-10-20 02:42:21

    +0

    'Stop-Service'不等待服務停止。你是否從'Wait-Process'中得到了非終止錯誤,或者是否聲稱過程已經結束? (如果在進程退出前返回Wait-Process,我不會感到驚訝) – jpmc26 2017-04-25 21:02:50

    回答

    1

    有時處理留自身報告「停止」的服務後開放。這將檢查您的.dll是否有任何迷路手柄,如果找到,它會修復它們。

    $lockedFile="C:\Program Files (x86)\MirrorService\AWSSDK.dll" 
    
    GPS|%{$LOCK = $_;$_.Modules|%{If($_.FileName -eq "$lockedFile"){Kill -id $LOCK.id -force}}} 
    
    +0

    感謝您的解決方案!不過,我寧願不喜歡黑客。另外,我根本沒有看到服務狀態:我要麼'taskkill'它的進程或者'stop-service',然後等待進程通過'wait-process'死掉。 – vorou 2014-10-20 02:31:03

    +0

    假設這個過程最終會死掉,你可能會將它改寫成等待文件解鎖的東西。 – jpmc26 2017-04-25 21:09:31