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 秒。一旦所有服务都没有 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
我是 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 秒。一旦所有服务都没有 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