无法将脚本块作为后台或远程作业启动,直接执行工作正常
Unable to start scriptblock as background or remote job, works fine executing directly
我有一个脚本块,我想 运行 作为后台作业。下面是我想要的命令 运行:
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' 显示为已完成,而实际上它还没有,或者根据丢失的文件判断似乎没有:'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 }
你如何传递 $source?因为如果你除了写变量名什么都不做,它将为空,如果它为空,你将在远程系统上为 $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 }
除了上面的好信息外,请记住,开始一份工作很像打开一个新控制台(您无法直接看到),这意味着您可能需要 re-connect 或 re-authenticate.例如,如果您想开始一个使用 PowerCLI 的新作业,您将必须 re-connect 到您的 vCenter Server,因此在您的脚本块中,您将在命令前加上 (connect-viserver...) : start-job -scriptblock {connect-viserver -server <vCenterServer>; powercli command}
.
我有一个脚本块,我想 运行 作为后台作业。下面是我想要的命令 运行:
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' 显示为已完成,而实际上它还没有,或者根据丢失的文件判断似乎没有:'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 }
你如何传递 $source?因为如果你除了写变量名什么都不做,它将为空,如果它为空,你将在远程系统上为 $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 }
除了上面的好信息外,请记住,开始一份工作很像打开一个新控制台(您无法直接看到),这意味着您可能需要 re-connect 或 re-authenticate.例如,如果您想开始一个使用 PowerCLI 的新作业,您将必须 re-connect 到您的 vCenter Server,因此在您的脚本块中,您将在命令前加上 (connect-viserver...) : start-job -scriptblock {connect-viserver -server <vCenterServer>; powercli command}
.