PowerShell - 仅当所有服务都已停止时才启动 rocopy

PowerShell - Start rocopy only if all services have stopped

我是 PowerShell 的新手,想知道是否有人可以帮助我解决以下问题,因为我无法在网站上找到有关此问题的任何先前讨论帖。

问题:有没有办法写出一个robocopy命令,让它只有在$stopservices中的服务全部停止时才会启动?以下是我所拥有的,但在某些时候,当 robocopy 启动时服务仍然是 运行,然后出现 "The process cannot access the file because it is being used by another process." 的错误。

<## Stop all services ##>
    write-host `r`n "Stopping services on "$server `r`n
    foreach ($service in $stopservices) 
    {
        set-service $service -ComputerName $server -StartupType Disabled -Status Stopped -PassThru
    }


<## Copy all files ##>
    $robocopy = "{0} {1} {2} /XF {3} {4} {5} /XD {6} {7} /MIR /MT /TEE /LOG:{8}" -f $robocopy, $source, $destination, $logPath
    Invoke-Expression $robocopy
    Pause

如果服务没有停止,您可以在 Set-Service.

之后尝试使用 Stop-Service Cmdlet
 Get-Service -Name $service -ComputerName $server | Stop-Service -Force 

然后您可以在 Robocopy 之前使用以下 while 循环等待服务停止。

While($stopservices | Get-Service | ? {$_.Status -eq "Running" -or $_.Status -eq "Stopping"}){
    Sleep -Seconds 5
}

如果 $stopservices 中的 1 个服务仍然 运行,这将使脚本休眠 5 秒。一旦所有服务都没有 RunningStopping 状态,Robocopy 将启动。所以整个脚本可能看起来像这样:

# Stop all services #
write-host `r`n "Stopping services on "$server `r`n
foreach ($service in $stopservices) 
{
    set-service $service -ComputerName $server -StartupType Disabled -Status Stopped -PassThru
    Get-Service -Name $service -ComputerName $server | Stop-Service -Force 

}

While($stopservices | Get-Service | ? {$_.Status -eq "Running" -or $_.Status -eq "Stopping"}){
    Sleep -Seconds 5
}

# Copy all files #
$robocopy = "{0} {1} {2} /XF {3} {4} {5} /XD {6} {7} /MIR /MT /TEE /LOG:{8}" -f $robocopy, $source, $destination, $logPath
Invoke-Expression $robocopy
Pause