目前,我已经注释掉了无法正常工作的代码,并且能够毫无问题地将其单线程化。我的目标是解雇四个作业(每个文件夹需要用robocopy复制),然后等待它们完成。
我曾在几个不同的地方尝试过启动cmdlet,但无济于事。
$destination = Read-Host 'Please supply the Destination hostname'
$folders = @("folder1","folder2","folder3","folder4")
foreach ($source_folder in $folders)
{
#Start-Job -Name FolderCreateProcess -ScriptBlock {
Write-Host -ForegroundColor Green "Now creating folder structure for " + $source_folder
$robocopystring = $robocopy + " " + "d:\" + $source_folder + " " + "\\" + $destination + "\" + $source_folder + " " + $robocopy_create_options + " /log:" + $robocopy_log_path + "\phase_1_create_" + $source_folder + "_log_" + $(Get-Date -Format yyyyMMddHHmm) + ".txt"
Invoke-Expression $robocopystring
#}
}
}
我希望这会在后台为每个文件夹启动一个作业,并让它们运行多线程。实际上,它启动了四个作业,但是它们与启动一样快结束,并且没有生成日志文件。
答案 0 :(得分:0)
作业在不同的范围内运行,因此脚本块的ouside中的变量不可用。您可以使用范围修饰符,或将变量作为参数传递。
此处的作业脚本块是单独定义的,而不与start-job内联-有助于提高可读性:
$RobocopyScriptBlock= {
param($src,$dest)
#your code
}
然后运行它:
Start-Job -ScriptBlock $RobocopyScriptBlock -ArgumentList $source_folder,$destination -Name 'jobname'
启动工作后,当您检查工作时并未发布零件。如果您不这样做,作业将不会自己返回结果和错误,甚至您也不会发现问题所在。了解有关Receive-Job
,Get-Job
和Remove-Job
cmdlet的更多信息。