Power Shell Windows Service Update dll's process

本文关键字:process dll Shell Windows Service Update Power | 更新日期: 2023-09-27 18:14:06

我有Power Shell脚本用于发布/更新运行windows服务的新dll:

Import-Module WebAdministration
function Main(
[string] $siteName = $(Throw "Value cannot be null: siteName"),
[string] $sitePath = $(Throw "Value cannot be null: sitePath"),
[string] $servicePath = $(Throw "Value cannot be null: sitePath"),
[string] $serviceName = $(Throw "Value cannot be null: sitePath"),
[string] $buildConfiguration = $(Throw "Value cannot be null: sitePath"))
{
...
   $serviceBinPath = Join-Path $serviceBinPath $buildConfiguration
   Write-Host "Directory of Windows Service : $($serviceBinPath )`r`n"
   StopWindowsService $serviceName
   RemoveFiles $servicePath 
   CopyFiles $serviceBinPath $servicePath
   StartWindowsService $serviceName
}
function RemoveFiles(
    [string] $path = $(Throw "Value cannot be null: sitePath"))
{
    If (Test-Path $path)
    {
        Write-Host "Removing folder ($path)...`r`n"
        Remove-Item -Recurse -Force "$($path)*"
        Write-Host "Successfully removed website folder ($path)...`r`n"        
    }
}
function CopyFiles(
    [string] $sourcePath = $(Throw "Value cannot be null: sitePath"),
    [string] $destinationPath = $(Throw "Value cannot be null: sitePath"))
{
    If ((Test-Path $sourcePath) -and (Test-Path $destinationPath))
    {
        Write-Host "Copy files from ($sourcePath) to folder ($destinationPath)...`r`n"
        Copy-Item "$($sourcePath)'*" $destinationPath -Recurse -Force
        Write-Host "Successfully copied files from ($sourcePath).`r`n"
    }
}
function StopWindowsService(
    [string] $serviceName = $(Throw "Value cannot be null: siteName"))
{
    $serviceBefore = Get-Service $serviceName
    Write-Host "($serviceName) is now ($serviceBefore.status)...`r`n"
    Write-Host "Stopping Windows Service ($serviceName)...`r`n"
    Stop-Service $serviceName
    Write-Host "Successfully stopped Windows Service ($serviceName)...`r`n"
    $serviceAfter = Get-Service $serviceName
    Write-Host "($serviceName) is now ($($serviceAfter.status))...`r`n"
}
function StartWindowsService(
    [string] $serviceName = $(Throw "Value cannot be null: siteName"))
{
    $serviceBefore = Get-Service $serviceName
    Write-Host "($serviceName) is now ($serviceBefore.status)...`r`n"
    Write-Host "Starting Windows Service ($serviceName)...`r`n"
    Start-Service $serviceName
    Write-Host "Successfully started Windows Service ($serviceName)...`r`n"
    $serviceAfter = Get-Service $serviceName
    Write-Host "($serviceName) is now ($($serviceAfter.status))...`r`n"
}

都可以启动/停止/复制新的Windows服务Dll。但是当我试图在停止服务后删除旧文件时,所有文件都被锁定,我得到错误:

Remove-Item : Cannot remove item ...'WindowsService'bin'Autofac.dll: Access to the path '...WindowsService'bin'Autofac.dll' is denied.

所有dll文件。

可能需要卸载/安装服务,而不是停止/运行?什么好主意吗?

Power Shell Windows Service Update dll's process

停止服务应该足够了。检查以下内容:

  1. 您正在使用直接路径到您的文件
  2. 运行脚本的应用程序或控制台在适当的特权用户下运行。
  3. 检查dll文件夹安全性。检查运行应用程序的用户是否有权删除指定文件夹
  4. 中的文件

我找到解决办法了。第一件事:我在安装windows服务后运行这个脚本处于停止状态,dll已经在文件夹中。第一次运行没有产生任何错误。在第二次运行后,我得到了错误。当我在停止服务和删除旧dll之前添加等待时,一切都很好:

StopWindowsService $serviceName
Start-Sleep -s 5
RemoveFiles $servicePath 
CopyFiles $serviceBinPath $servicePath
StartWindowsService $serviceName

我认为这是因为文件在停止服务后还没有立即解锁。

非常感谢。不好意思,英文不好