2017-09-06 2 views
1

ジョブで次のスクリプトを実行しようとしていますが、ブロック内のコードが最初のコマンドのみを実行して終了します。仕事は私がコメントアウトした場合-asjob -jobname IIS_Maintenanceジョブが細かい実行されますが、それは同期だPowerShellリモートセッションとStart-Jobの問題

$computers = get-adcomputer -filter * | where { ($_.DNSHostName -match 'server')} 

foreach ($computer in $computers) { 
     $session = New-PSSession -ComputerName $computer.DNSHostName 
     Invoke-Command -Session $session -ScriptBlock { 
      Stop-Service W3SVC -Force 
      Remove-Item "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root" -Force -Recurse 
      Start-Service W3SVC  
     } -asjob -jobname IIS_Maintenance 
     Remove-PSSession -Session $session 
} 

自分のコンピュータ上で完了が表示されます。 IISを停止するのに数秒かかるが、なぜジョブがそれを待っているのかわからない。

思考?

+0

'Invoke-Command -Computer $ computers -ScriptBlock {...} -AsJob -JobName IIS_Maintenance'? –

+0

これを非同期で実行しようとしていますか? – ArcSet

+0

Argghhhh私はちょうど私が悪いコードを入れたことに気づいた、私は問題が何であるか把握するために実験を始めた...正しいコードは: $ session = New-PSSession -ComputerName $ computer.DNSHostName Invoke-Command - Session $ session -ScriptBlock .... 開始ジョブ行はありません。はい、私は非同期の方法でこれを実行しようとしているので、X個の並列ジョブを持つことができます。 – opti2k4

答えて

0

セッションを作成すると、多くの遅延が発生します。 -ComputerNameを直接使用する代わりに、-Sessionを使用することを決めたのはなぜですか?

私は-ComputerName方法を使用するとより効率的なStart-Jobと実行すると思います。いずれにしても、リモートマシン上のジョブを呼び出すため、ワークステーションはジョブの進行状況を把握することができません。

ジョブの進捗状況を追跡する場合は、Invoke-Commandをまったく使用しないでください。

OK
+0

セッションを使用する理由は、いくつかのコマンドを実行する必要があるため、セッションを開き、いくつかのコマンドを実行してからセッションを閉じる方が効果的と思われるからです。 PSチック:\ begin-job -scriptblock {invoke-command -command {dir} ➥-computername SERVER-R2} これは完全に冗長です。 Invoke-Commandセクションを維持し、-AsJob パラメータを使用してバックグラウンドで実行します。 – opti2k4

0

私はそれを考え出した...混乱のポイントは:

1)私は、セッションなしで、コードのブロックを送信することができます知らなかったとはいセッションの実装は

2遅いです)Iまた私はいくつかのコンピュータにinvokeコマンドを送信したことを知らなかった一度foreachなしです。そのAnsgar Wiechersありがとう!

関連する問題