2015-08-19 2 views
2

У меня есть функция PowerShell, которая вызывает Write-Progress. В другой функции я хотел бы получить состояние отображаемого прогресса. Можно ли запросить состояние отображаемого прогресса?Как получить информацию о ходе работы от Write-Progress?

Прецедент это:

  • У меня есть функция А, который вызывает функцию B 10 раз.
  • Каждый раз, когда функция A вызывает функцию B, вызывается для вызова -PercentComplete.
  • Внутри функции B, я хотел бы обновить -PercentComplete прогресса, но я не знаю, что представляет собой текущий процент. Я также не хочу передавать объект «Прогресс» в B, если я могу запросить отображаемый объект прогресса.

Я отметил это как , потому что это то, что моя среда.

Я пробовал посмотреть в переменной $host, а также $host.UI и $host.UI.RawUI и не смог найти то, что я хочу.

Так что для кого-либо еще, что это интересно, я в конечном итоге определить эти две функции в модуле (престижность для HAL9256 для вдохновения):

function Get-Progress { 
    [cmdletbinding()] 
    param() 

    if (-not $global:Progress) { 
     $global:Progress = New-Object PSObject -Property @{ 
      'Activity' = $null 
      'Status' = $null 
      'Id' = $null 
      'Completed' = $null 
      'CurrentOperation' = $null 
      'ParentID' = $null 
      'PercentComplete' = $null 
      'SecondsRemaining' = $null 
      'SourceId' = $null 
     } 
    } 

    $global:Progress 
} 




function Show-Progress { 
    [cmdletbinding()] 
    param() 

    $progress = $global:Progress 

    $properties = $progress.PSObject.Properties | Where {$_.MemberType -eq 'NoteProperty'} 

    $parameters = @{} 
    foreach ($property in $properties) { 
     if ($property.Value) { 
      $parameters[$property.Name] = $property.Value 
     } 
    } 

    if ($parameters.Count) { 
     Write-Progress @parameters 
    } 
} 
+0

ooooohhhh cool. Создание нового пользовательского 'PSObject' для сохранения прогресса ... приятно! – HAL9256

ответ

1

Там нет ничего, чтобы запросить. Вы должны сами отслеживать/вычислять процент и передавать его командлету, иначе Write-Progress не знал, что отображать.

функция Дает B дополнительный параметр и добавить счетчик для работы A:

function A { 
    $i = 1 
    1..10 | % { 
    B (10 * $i) 
    $i++ 
    } 
} 

function B($p) { 
    Write-Progress -Activity 'foo' -PercentComplete $p 
} 
+0

спасибо Ансгару, я понимаю о вычислении процента. Я надеялся, что есть Model-View с индикатором прогресса, поэтому я мог бы запросить его –

1

я испытал подобный вопрос, где у меня есть модуль, который запускает операции сценария и отдельный модуль протоколирования, который должен ход журнала. Самый простой и из всех возможных методов - самый надежный метод (и я знаю, что люди будут дрожать) - использовать глобальную переменную.

Если вы не хотите иметь кучу дополнительных параметров, передаваемых туда и обратно, это лучший способ.

#Set global variable 
$global:Progress = 10 

#------ Other function ----------- 

#Write Progress 
Write-Progress -Activity 'foo' -PercentComplete $global:Progress 
+0

Спасибо HAL9256, похоже, это то, что я тоже буду делать –

Смежные вопросы