Я измеряю истекшее время командлета Invoke-ASCmd
с помощью следующего сценария:
$elapsedTime = [system.diagnostics.stopwatch]::StartNew()
$j = Start-Job -Arg $XMLF, $Server, $output_file -ScriptBlock {
Param($XMLF, $Server, $output_file)
Invoke-ASCmd –InputFile $XMLF -Server "$Server" >$output_file
}
do {
write-progress -activity "Syncing..." -status "$($elapsedTime.Elapsed.ToString())" -percentcomplete ([Math]::Min(100*($elapsedTime.Elapsed.Seconds / 20),100));
-Milliseconds 250
} while ($j.State -eq 'Running')
Receive-Job -Job $j
$elapsedTime.stop()
, поскольку не существует «прямого» способа измерить, насколько далеко продвинулся процесс до 100%, я »подделывая это".Поскольку для базы данных, на которой я тестирую, требуется около 20 секунд, я просто выполняю некоторые вычисления, используя время от 0 до 20 в качестве от 0 до 100:
[Math]::Min(100*($elapsedTime.Elapsed.Seconds / 20),100)
Однако это не так.всегда будет 20. поэтому я не могу жестко закодировать это значение, особенно у меня есть около 30 баз данных, которые различаются по размеру и, следовательно, по продолжительности.
как таковой, я думаю, что нет способа измерить командлет Inovke-ASCmd, может быть, я могу каким-то образом измерить до истекшего времени или до времени, когда файл выводится с тех пор, когда онуказывает на конец команды, я думаю.
Хотя, я не знаю, будет ли это возможно, потому что технически ему придется каким-то образом знать будущее, когда он закончится или когда файл будет выведен, потому что для этого нужно заранее указать значение
что-то вроде динамического значения:
[Math]::Min(100*($elapsedTime.Elapsed.Seconds / $DynamicValue),100)
Следовательно, как я могу это сделать?
также, синий экран прогресса, я ожидаю, что он исчезнет по истечении истекшего времени ... но он сохраняется на консоли и остается там.как я могу заставить его исчезнуть после того, как он закончился?
related: Почему команда в ScriptBlock не работает?