Я работаю над сценарием для переноса двоичных файлов Office 365 ProPlus в 12 отдельных файловых ресурсов с помощью BITS.Я хочу также отображать ход этих переводов на экране.Моя проблема в том, что я хочу ограничить количество одновременных переводов BITS не более чем 4 одновременно.По завершении одного задания я хочу запустить следующее задание в очереди и продолжать получать информацию о ходе выполнения до завершения всех заданий.
Это то, что я имею до сих пор.Сначала я запускаю эту функцию, чтобы создать все мои задания BITS для всех сетевых расположений в приостановленном состоянии.
function Start-BinaryTransfer
{
[CmdletBinding()]
param
(
[array]$DistrictsToUpdate
)
$Source = "$BaseSource\$UpdateChannel"
if ("All" -in $DistrictsToUpdate.Split(','))
{
foreach ($Destination in $ReposList)
{
Copy-Item -Path $Source -Destination $($Destination.Location + '\') -Filter { $_.PSisContainer } -Recurse -ErrorAction SilentlyContinue
Get-ChildItem -Path $Source -Recurse | Where-Object{ $_.PSisContainer } | ForEach-Object {
$spath = $_.FullName.Remove(0, $Source.Length + 1)
$BITSJobs += Start-BitsTransfer -Source $Source\$spath\*.* `
-Destination "$($Destination.Location)\$UpdateChannel\$spath" `
-DisplayName "$($Destination.District) File Transfer" `
-Description "Transferring from [$Source] to [$($Destination.Location)\$UpdateChannel]" `
-Suspended
}
}
}
После создания всех заданий я пытаюсь использовать этот цикл «В течение», чтобы запустить 4 задания ввремя, и покажите прогресс, как я иду.К сожалению, реальное поведение состоит в том, что он пытается запустить все 12 заданий одновременно, что приводит к перебоям в работе сетевых ресурсов.
While (Get-BitsTransfer | Where JobState -EQ "Suspended")
{
Get-BitsTransfer | Where JobState -EQ "Suspended" | ForEach-Object {
for ($JobsCount = 0; $JobsCount -le 4; $JobsCount++)
{
if ($JobsCount -lt 4)
{
Resume-BitsTransfer -BitsJob $_ -Asynchronous
Get-BitsTransfer | Where JobState -EQ "Transferring" | ForEach-Object {
Write-Progress `
-Id $([math]::Abs($_.DisplayName.GetHashCode())) `
-Activity "$($_.DisplayName)" `
-Status "$($_.Description)" `
-CurrentOperation "$([math]::Floor($_.BytesTransferred / $_.BytesTotal * 100)) % Complete" `
-PercentComplete $([math]::Floor($_.BytesTransferred / $_.BytesTotal * 100))
}
}
}
}
if (Get-BitsTransfer | Where JobState -EQ "Transferred")
{
Get-BitsTransfer | Where JobState -EQ "Transferred" | Complete- BitsTransfer
$JobsCount--
}
}