【问题标题】:Copy-Item : The process cannot access the file 'dll' because it is being used by another processCopy-Item:该进程无法访问文件“dll”,因为它正被另一个进程使用
【发布时间】:2021-04-29 22:15:23
【问题描述】:

我有一个脚本可以将所有工件 dotnet 复制到远程服务器(从 Jenkins 服务器到远程服务器上的 IIS 文件夹),用于部署阶段,如下所示:

#Parameters
param($userName, $passWord, $serverName, $deployFolder, $destinationFolder, $iisName)

$passwd = ConvertTo-SecureString $passWord -AsPlainText -Force
$creds = New-Object -typename System.Management.Automation.PSCredential -argumentlist $userName, $passwd

$session = New-PSSession -ComputerName $serverName -Credential $creds

#Stop IIS Application
Invoke-Command -Session $session -ScriptBlock { Import-Module IISAdministration; Stop-Website $args[0];}  -ArgumentList $iisName

Start-Sleep -s 200

#Copy new build to deploy folder
Copy-Item -Recurse -Force -Path $deployFolder -Destination $destinationFolder -ToSession $session

#Start IIS Application
Invoke-Command -Session $session -ScriptBlock { Import-Module IISAdministration; Start-Website $args[0];}  -ArgumentList $iisName

但有时我遇到问题Copy-Item : The process cannot access the file 'dll' because it is being used by another process.

有什么想法吗?请告诉我!
谢谢

【问题讨论】:

  • 好吧,你可能已经知道原因了。为什么添加Start-Sleep cmdlet?您如何断言您的 Web 服务在替换文件时不再运行?
  • 使用 Robocopy 复制文件,它具有内置的重试逻辑。在复制之前尝试测试文件是否被锁定是没有用的,因为这很容易出现竞争条件。
  • @Thomas 我不确定如何在复制之前停止我的网络服务的所有文件。所以我使用了 Sleep cmdlet。我知道这种方式不好。但我不知道有什么方法可以做到这一点。有时这个问题仍然会发生。
  • 如果要停止web服务,可以stop websitestop app pool,这样dll就不会被其他进程使用了​​。
  • 除了网站外,还需要停止应用池,应用池会将应用缓存预加载到本地。

标签: .net powershell iis web-deployment


【解决方案1】:

作为 Bruce Zhang 的 cmets,我将 stop app pool 添加到我的脚本中。有用。
Stop-WebAppPool -Name $args[0];

【讨论】:

    猜你喜欢
    • 2010-12-10
    相关资源
    最近更新 更多