none
Ошибка при выполнении Recieve-job RRS feed

  • Вопрос

  • Доброго времени суток. 

    Есть Job зеркалирования множества  папок с помощью Robocopy

    Все работает нормально, пока объем данных не является большим, при большом объеме получаю следующую ошибку

    ERROR: Receive-Job : Длина результирующего массива недостаточна. Проверьте значения destIndex и length, а также нижние границы массива.
    ERROR: D:\TEST2.Run.ps1:857 знак:18
    ERROR: + ... $progress = Receive-Job -Job $Job -Keep -ErrorAction SilentlyContinue ...
    ERROR: +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ERROR:     + CategoryInfo          : NotSpecified: (:) [Receive-Job], ArgumentException
    ERROR:     + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ReceiveJobCommand
    ERROR:

    И Gui форма подвисает через некоторое время.  Как исправить проблему?

    Заранее спасибо

    • Изменено Omni_Vidente 10 августа 2016 г. 8:14
    10 августа 2016 г. 8:13

Ответы

  • Проблема решилась сама собой. Первая ошибка возникала из за того что в Job была указана операция которая не была прописана для получения Recieve-job (Запуск стороннего exe файла), а зависания из-за того что были  скрыты объекты за пределами формы.
    • Помечено в качестве ответа Omni_Vidente 10 августа 2016 г. 15:03
    10 августа 2016 г. 15:03

Все ответы

  • Получать порциями(без -Keep) или использовать /log в robocopy и уже потом парсить, или фильтровать часть информации в job.

    $sb = New-Object System.Text.StringBuilder
    while($job.State -eq "Running") {
    	if($job.HasMoreData) {
    		$data = Receive-Job $job
    		if($data) {
    			$sb.AppendLine($data) | Out-Null
    			Start-Sleep -Seconds 30
    		}
    	}
    }
    $sb.ToString()

    10 августа 2016 г. 8:46
    Отвечающий
  • /NDL /NFL /NP

    ?


    • Изменено Svolotch 10 августа 2016 г. 8:54
    10 августа 2016 г. 8:53
  • Без keep никак не могу получить всей нужной мне информации

    $progress = Receive-Job -Job $Job -Keep -ErrorAction SilentlyContinue
    				$copiedfiles = ($progress | Select-String -SimpleMatch 'Новый файл')
    				if ($copiedfiles.count -le 0) { $TotalFilesCopied = $copiedfiles.Count }
    				else { $TotalFilesCopied = $copiedfiles.Count - 1 }
    				$FilesRemaining = ($totalfiles - $TotalFilesCopied)
    				$Bytesarray = @()
    				foreach ($Newfile in $copiedfiles)
    				{
    					$Bytesarray += ($Newfile.tostring() -split "\s+")[3]
    				}
    				if ($progress)
    				{
    					if ($progress[-1] -match '%') { $Filepercentcomplete = $progress[-1].substring(0, 3).trim() }
    					else { $Filepercentcomplete = 0 }
    				}
    			
    				$bytescopied = ([int64]$Bytesarray[-1] * ($Filepercentcomplete/100))
    				$totalfilebytes = [int64]$Bytesarray[-1]
    				$TotalBytesCopied = ((($Bytesarray | Measure-Object -Sum).sum) - $totalfilebytes) + $bytescopied
    				$TotalBytesRemaining = ($totalbytes - $totalBytesCopied)
    				if ($copiedfiles)
    				{
    					$currentfile = (($copiedfiles[-1].tostring() -split "\s+")[4]).trim()
    				}
    				$totalfilescount = $totalfiles
    				
    				$totalPercentcomplete = (($TotalBytesCopied/$totalbytes) * 100)
    				if ($totalbytes -gt 2gb) { $BytesCopiedprogress = "{0:N2}" -f ($totalBytesCopied/1gb); $totalbytesprogress = "{0:N2}" -f ($totalbytes/1gb); $bytes = 'Gb' }
    				else { $BytesCopiedprogress = "{0:N2}" -f ($totalBytesCopied/1mb); $totalbytesprogress = "{0:N2}" -f ($totalbytes/1mb); $bytes = 'Mb' }
    				if ($totalfilebytes -gt 1gb) { $totalfilebytes = "{0:N2}" -f ($totalfilebytes/1gb); $bytescopied = "{0:N2}" -f ($bytescopied/1gb); $filebytes = 'Gb' }
    				else { $totalfilebytes = "{0:N2}" -f ($totalfilebytes/1mb); $bytescopied = "{0:N2}" -f ($bytescopied/1mb); $filebytes = 'Mb' }
    				
    				if ($totalPercentcomplete -lt 100)
    				{
    					$progressbaroverlay1.TextOverlay = 'Копируется ' + "$currentfile" + ':' + "$bytescopied" + ' из ' + "$totalfilebytes" + " " + "$filebytes"
    					$progressbaroverlay1.Value = $Filepercentcomplete
    					$progressbar1.TextOverlay = $bytescopiedprogress + ' из ' + $totalbytesprogress + ' ' + $bytes + ' скопировано'
    					$progressbar1.Value = $totalPercentcomplete
    					
    				}

    В принципе с этой ошибкой продолжает копировать и правильно считать, путем проб понял что зависание формы возникает не из за этой ошибки, а при клике на заголовке формы или сворачивании во время работы. Сама форма создавалась в powershell studio 





    • Изменено Omni_Vidente 10 августа 2016 г. 11:26
    10 августа 2016 г. 10:21
  • Проблема решилась сама собой. Первая ошибка возникала из за того что в Job была указана операция которая не была прописана для получения Recieve-job (Запуск стороннего exe файла), а зависания из-за того что были  скрыты объекты за пределами формы.
    • Помечено в качестве ответа Omni_Vidente 10 августа 2016 г. 15:03
    10 августа 2016 г. 15:03