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

时间:2016-07-13 14:07:38

标签: powershell robocopy

我是PowerShell的新手,并且想知道是否有人可以帮助我完成以下操作,因为我无法在网站上找到此问题的任何先前帖子。

问题:有没有办法写出一个robocopy命令,只有当$ stopservices中的服务全部停止时它才会启动?下面是我所拥有的,但在某些时候,当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
    }


<## 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

1 个答案:

答案 0 :(得分:0)

如果服务没有停止,您可以尝试在Stop-Service之后使用Set-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中的一项服务仍在运行,这将使脚本休眠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