2017-09-06 7 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 방금 잘못된 코드를 넣었습니다. 문제가 무엇인지 파악하기 위해 실험을 시작했습니다. 올바른 코드는 다음과 같습니다. $ 세션 = New-PSSession -ComputerName $ computer.DNSHostName Invoke-Command - 세션 $ 세션 -ScriptBlock .... 시작 - 작업 줄이 없습니다. 예, 비동기 방식으로이 작업을 실행하려고하므로 X 개의 병렬 작업을 가질 수 있습니다. – opti2k4

답변

0

세션을 생성하면 많은 지연이 발생합니다. -ComputerName을 직접 사용하는 대신 -Session을 사용하기로 선택한 이유는 무엇입니까?

나는 Start-Job과 함께 실행하는 것이 더 효율적일 것입니다. -ComputerName을 사용하는 것이 좋습니다. 어느 쪽이든, 원격 시스템에서 작업을 호출하기 때문에 워크 스테이션은 작업 진행에 대한 단서가 없습니다.

작업 진행률을 추적하려면 Invoke-Command을 전혀 사용하지 않아야합니다.

+0

세션을 사용하는 이유는 세션을 열고 여러 명령을 실행 한 다음 세션을 닫는 것이 더 효과적 이도록 여러 명령을 실행해야하기 때문입니다. PS : \> start-job -scriptblock {invoke-command -command {dir} ➥-computername SERVER-R2} "점심 한 달에 Powershell 배우기" Invoke-Command 섹션을 유지하고 -AsJob 매개 변수를 사용하여 백그라운드에서 실행되도록합니다. – opti2k4

0

확인을 나는 그것을 알아 냈 ... 혼란의 지점이었다 :

1) 내가 세션없이 코드의 블록을 보낼 수 있습니다 몰랐다 그래 세션 구현

2)을 천천히 한번도 foreach없이 여러 컴퓨터에 invoke-command를 보내는 것을 몰랐습니다. Ansgar Wiechers에게 감사드립니다!