2016-07-13 10 views
0

Ich bin neu bei PowerShell und habe mich gefragt, ob mir jemand bei dem folgenden helfen kann, da ich keinen vorherigen Thread für diese Frage auf der Website finden konnte.PowerShell - Starten Sie rocopy nur, wenn alle Dienste gestoppt haben

Frage: Gibt es eine Möglichkeit, einen robocopy-Befehl zu schreiben, so dass er nur startet, wenn die Dienste in $ stopservices alle gestoppt haben? Unten ist, was ich habe, aber an einigen Punkten läuft der Dienst noch, wenn die Robocopy startet und dann Fehler für "Der Prozess kann nicht auf die Datei zugreifen, weil sie von einem anderen Prozess verwendet wird.".

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

Antwort

0

Wenn die Dienste nicht zu stoppen Sie könnten versuchen, die Stop-Service Cmdlets nach Set-Service verwenden.

Get-Service -Name $service -ComputerName $server | Stop-Service -Force 

Dann könnten Sie warten, bis die Dienste nur unter Verwendung der folgenden while-Schleife zu stoppen, bevor die Robocopy.

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

Dies wird das Skript für 5 Sekunden schlafen, wenn 1 der Dienste in $stopservices läuft noch sind. Sobald alle Dienste keinen Running oder Stopping Status haben, wird Robocopy gestartet. So könnte das ganze Skript in etwa so aussehen:

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

Danke Richard! Das ist toll. Ich habe es ohne das Cmdlet Stop-Service versucht, aber die While-Schleife hinzugefügt. Aus irgendeinem Grund scheint es nach dem 5-Sekunden-Zeitraum nicht so, dass es zurückläuft, um zu versuchen, den anderen Dienst zu stoppen, der immer noch in $ stopservices läuft. – Mike