2016-08-02 7 views
0

백그라운드 작업으로 실행하고 싶은 스크립트 블록이 있습니다. 아래 명령을 실행하고 싶습니다.배경 또는 원격 작업으로 scriptblock을 시작할 수 없습니다. 직접 잘 실행됩니다.

Get-ChildItem -Recurse $source | Get-DfsrFileHash | Export-csv -Append C:\Temp\Test_Source_Checksum.csv 

이 명령을 실행하면 문제없이 성공적으로 처리됩니다.

나는에 대해 다음 시도 '시작 - 작업'

이 결과
Start-Job -ScriptBlock { Get-ChildItem -Recurse $source | Get-DfsrFileHash | Export-csv -Append C:\Temp\Test_Source_Checksum.csv } 

'은 Get-작업'실제로 었소, 또는 나던 누락 된 파일에 의해 판단하는 것으로 나타날 경우, 완료로 표시 : 'Test_Source_Checksum.csv'는

나는 또한이 결과 '호출-명령'

Invoke-Command -AsJob -ComputerName ($env:COMPUTERNAME) -ScriptBlock { Get-ChildItem -Recurse $source | Get-DfsrFileHash | Export-csv -Append C:\Temp\Test_Source_Checksum.csv } 

에 대해 다음 사용하여 시도했다 '- 작업하기'실패에 디스플레이하는.

내가 사용 실패 표시하는 경우 : 내가 다시 아무것도 얻을

(get-job -name Job38).JobStateInfo.Reason 

을 ...

내가 잘못 여기서 시작 - 작업/호출-명령을 사용하여 건가요?

배경 작업으로이 작업을 실행하려는 이유는 많은 양의 데이터와 체크섬을 (DFS 마이그레이션의 경우) 복사하려고하기 때문입니다. 그때 검사에게 작은 부분 집합에 자사를 통해 다음 배치를 복사하는 동안 복사 된 데이터를 데이터를 복사하고 싶습니다 ... 씻어

감사합니다,

를 반복 크리스

편집 : 다음은 전체 스크립트의 사본입니다 :

##----------------------------------------------------------------------------------## 
$source="E:\DFSR_Migration_Test_Prod" 
$dest="F:\DFSR_Migration_Test_Prod" 
$what = @("/COPYALL","/B","/SEC","/E","/xd","dfsrprivate") 
$options = @("/R:6","/tee","/MT:32") 
$cmdArgs = @("$source","$dest",$what,$options) 
##----------------------------------------------------------------------------------## 
robocopy @cmdArgs 
Write-Output "Prod_Copied @" (get-date) | Out-File C:\Temp\File_Copy.txt -Encoding ascii -Append -NoClobber 
Write-Output "Initiating Prod Source Checksum @" (get-date) | Out-File C:\Temp\File_Copy.txt -Encoding ascii -Append -NoClobber 
Start-Job -ScriptBlock { Get-ChildItem -Recurse $source | Get-DfsrFileHash | Export-csv C:\Temp\Prod_Source_Checksum.csv } 
Write-Output "Initiating Prod Destination Checksum @" (get-date) | Out-File C:\Temp\File_Copy.txt -Encoding ascii -Append -NoClobber 
Start-Job -ScriptBlock { Get-ChildItem -Recurse $dest | Get-DfsrFileHash | Export-csv C:\Temp\Prod_Destination_Checksum.csv } 
+0

작업 결과를 얻으려고하면 오류 메시지가 표시됩니까? 'Get-Job | Receive-Job' – boeprox

+0

예, 감사합니다. WinRM이 Invoke-Command를 실행할 수없는 설정이었습니다. 이제이 문제가 해결되었지만 Invoke-Command와 Start-Job이 둘 다 완료된 것으로 말하고 있지만 Script Block을 실행하지 않았습니다 ('Test_Source_Checksum.csv'없음) –

+0

실행중인 PowerShell 버전은 무엇입니까? Get-DfsrFileHash 명령을 실행하기 전에 스크립트 블록 내에서 모듈을 가져 오려고 했습니까? – boeprox

답변

0

어떻게하면 $ source가 전달됩니까? 왜냐하면 변수 이름을 쓰는 것 외에는 아무 일도하지 않기 때문에 null이 될 것이고, 널 (null)이면 원격 시스템에서 $ pwd.Path에 대해 Get-ChildItem을 실행할 것입니다.

가장 간단한 해결책은 소스를 사용하여 $ source를 $로 만드는 것입니다.

Invoke-Command -AsJob -ComputerName ($env:COMPUTERNAME) -ScriptBlock { Get-ChildItem -Recurse $using:source | Get-DfsrFileHash | Export-csv -Append C:\Temp\Test_Source_Checksum.csv } 
+0

$ 소스가 스크립트 상단에 지정되어 있습니다. 전체 게시물을 포함하도록 원래 게시물을 업데이트했습니다. 스크립트 –

+0

$ source :를 사용하여 로컬 변수를 참조하지 않는 한 스크립트 상단에 선언 된 $ source는 Invoke-Command에서 사용할 수 없습니다. 또는 ArgumentList (및 $ args 또는 param 블록 선언)를 사용하여 무언가를 전달하십시오.-ComputerName 매개 변수를 사용하지 않았다면 정상적으로 작동했을 것입니다. –

+0

아하! 그게 다야, 크리스, 네가 대단히 감사합니다! btw 나는 -Computername없이 시도했지만 그것이 실패로 그것을 추가했지만 WinRM이 제대로 설치되지 않았기 때문이라고 생각합니다 .... 수업을 통해 :) :) Thanks again –