0

バックグラウンド ジョブとして実行したいスクリプトブロックがあります。以下は、実行したいコマンドです。

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

このコマンドを実行すると、問題なく正常に実行されます。

「Start-Job」に対して次のことを試しました

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

これにより、「Get-Job」が実際には完了していないか、欠落しているファイルによって判断されていないように見える場合に、「Get-Job」が完了したと表示されます:「Test_Source_Checksum.csv」

「Invoke-Command」に以下を使用してみました

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

これにより、'Get-Job' の表示に失敗しました。

次を使用して失敗を表示する場合:

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

何も返ってこない…

ここで Start-Job/Invoke-Command を間違って使用していますか?

これをバックグラウンド ジョブとして実行したい理由は、大量のデータをコピーしてチェックサムを取得しようとしているからです (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 }
4

2 に答える 2

0

$source をどのように渡していますか? 変数名を書き込む以外に何もしていない場合は null になり、null の場合はリモート システムで $pwd.Path に対して Get-ChildItem を実行することになるためです。

最も簡単な解決策は、$source を $using:Source にすることです。

Invoke-Command -AsJob -ComputerName ($env:COMPUTERNAME) -ScriptBlock { Get-ChildItem -Recurse $using:source |  Get-DfsrFileHash | Export-csv -Append C:\Temp\Test_Source_Checksum.csv } 
于 2016-08-02T12:00:11.107 に答える