我尝试使用PowerShell自动部署Windows服务。我遇到问题的步骤是停止当前版本并将其删除。
由于它是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
/ Unlocker释放DLL PS:我已经尝试了使用stop-service
和wait-process
停止服务的更好方法,结果是相同的。
UPD :在停止服务和删除文件之间延迟300毫秒似乎可以解决问题,但我仍在寻找(1)行为解释和(2)a更可靠的方法来确保dll被释放。
答案 0 :(得分:1)
有时句柄在服务本身报告后停止打开&#34;停止&#34;。这将检查你的.dll是否有任何迷路手柄,如果找到,它会修复它们。
$lockedFile="C:\Program Files (x86)\MirrorService\AWSSDK.dll"
GPS|%{$LOCK = $_;$_.Modules|%{If($_.FileName -eq "$lockedFile"){Kill -id $LOCK.id -force}}}