我是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
答案 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秒钟。一旦所有服务都没有Running
或Stopping
状态,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