无法将scriptblock作为后台或远程作业启动,可以直接执行

时间:2016-08-02 11:22:54

标签: powershell invoke-command start-job

我有一个脚本块我想作为后台工作运行。以下是我想要运行的命令:

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-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 }

2 个答案:

答案 0 :(得分: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 } 

答案 1 :(得分:0)

除了上面的好信息之外,请记住,开始一项工作很像打开一个新的控制台(你无法直接看到),这意味着你可能需要重新连接或重新验证。例如,如果要启动使用PowerCLI的新作业,则必须重新连接到vCenter Server,因此在脚本块中,您将在命令前加上(connect-viserver ...):{{1 }}