2016-07-13 5 views
0

PowerShellを初めて使用していて、サイト上でこの質問に対して前回のスレッドが見つかりませんでしたので、PowerShell - すべてのサービスが停止している場合のみ、rocopyを開始します。

質問:$ stopservicesのサービスがすべて停止した場合にのみ起動するようにrobocopyコマンドを書き出す方法はありますか?以下は私が持っているものですが、いくつかの点では、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

サービスはあなたがSet-ServiceStop-Serviceコマンドレットを使用してみてください可能性が停止されていない場合。

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

ありがとうございました!これは素晴らしい。 Stop-Serviceコマンドレットなしで試してみましたが、whileループを追加しました。何らかの理由で5秒後に$ stopservicesで実行中の他のサービスを停止しようとしていると思われます。 – Mike

関連する問題