2016-08-02 5 views
0

J'ai un script que je voudrais exécuter en tâche de fond. Voici la commande que je voudrais exécuter:Impossible de démarrer scriptblock en tâche de fond ou à distance, fonctionne correctement en cours d'exécution

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

Si j'exécute cette commande, elle réussit sans problème.

J'ai essayé ce qui suit pour

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

« Start-Job » Cela se traduit par « Get-Job » affichage comme terminée, quand il fait hasnt, ou ne marche pas semble avoir à en juger par le fichier manquant: 'Test_Source_Checksum.csv'

J'ai aussi essayé d'utiliser ce qui suit pour 'Invoke-Command'

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

Cela se traduit par 'Get-Job' l'affichage a échoué.

Si j'afficher l'échec en utilisant:

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

Je ne reçois rien ... retour

Suis-je utiliser Start-Job/Invoke-Command de manière incorrecte ici?

La raison pour laquelle je voudrais exécuter ce travail en arrière-plan est, im essayant de copier de grandes quantités de données et de checksum il (pour une migration DFS). Je voudrais copier les données dans les petits sous-ensembles, puis contrôle les données qui a été copié tandis que sa copie du lot suivant sur ... rincer et répéter

Merci,

Chris

EDIT: Voici une copie de l'ensemble du script:

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

Voyez-vous des erreurs affichées si vous essayez de recevoir les résultats du travail? 'Get-Job | Receive-Job' – boeprox

+0

Oui je le fais, merci, il semble que WinRM n'était pas configuré, donc je ne pouvais pas lancer Invoke-Command. Ceci est maintenant résolu, mais maintenant, Invoke-Command et Start-Job sont les mêmes, comme dans, ils disent tous deux terminés mais n'ont pas exécuté le scriptblock (pas 'Test_Source_Checksum.csv') –

+0

Quelle version de PowerShell utilisez-vous? Avez-vous essayé d'importer le module dans le scriptblock avant d'exécuter la commande Get-DfsrFileHash? – boeprox

Répondre

0

Comment transmettez-vous $ source? Parce que si vous ne faites rien d'autre que d'écrire le nom de la variable, il sera null, et s'il est nul, vous exécuterez Get-ChildItem pour $ pwd.Path sur le système distant.

La solution la plus simple est de faire de $ source en $ en utilisant: 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

$ source est spécifié en haut du script, j'ai mis à jour le message original pour inclure l'ensemble script –

+0

$ source déclaré en haut du script ne sera pas disponible dans Invoke-Command à moins que vous n'utilisiez $ using: pour référencer la variable locale. Vous pouvez également passer quelque chose en utilisant ArgumentList (et $ args ou déclarer un bloc param).Si vous n'aviez pas utilisé le paramètre -ComputerName, cela aurait été parfait. –

+0

Aha! C'est exactement ça, Chris, Merci beaucoup pour votre contribution! btw j'ai essayé sans -computername mais je l'ai ajouté comme il échouait, mais je suppose que cela était dû à WinRM n'étant pas configuré correctement .... leçon apprise :) Merci encore –