在进程被杀死后DLL仍然被locking

我正尝试使用PowerShell自动化Windows Service部署。 我遇到的问题是停止当前版本并将其删除。

由于它是一个CI代理,我不关心正确地停止服务,所以我只是用taskkill /f /im:<exe name>杀死进程。 然后我尝试删除文件,并在大约3次我得到这个:

 Exception: Access to the path 'C:\Program Files (x86)\MirrorService\AWSSDK.dll' is denied. 

但是,只有在我刚杀死的进程中才使用这个DLL。 我试图捕捉exception并logginghandle.exe输出。 日志中没有这个DLL的句柄,我可以删除它。

所以显然taskkill完成工作和处理释放之间有一段时间的滞后。 什么是最干净的方式等待呢? 这就是我到目前为止所做的,没有一个对我来说看起来很干净。

  • taskkillrm之间放置一个延迟(多长时间?)
  • 捕获exception并在暂停后重试rm
  • 使用handle.exe / Unlocker来释放DLL

PS:我尝试了更好的方法来停止stop-servicewait-process ,结果是一样的

UPD :在停止服务和删除它的文件之间延迟300ms似乎有诀窍,但是我仍然在寻找(1)解释行为和(2)确保释放dll的更可靠的方法。

在服务本身报告“已停止”之后,有时句柄会保持打开状态。 这将检查您的.dll的任何迷路手柄,如果找到,它修复它们。

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