Да, процесс идет быстро, потому что PowerShell требуется 1 секунда для загрузки модуля, прежде чем произойдет ошибка. Мы можем увидеть сообщение об ошибке с Receive-Job
:
PS C:\> Receive-Job $j
InputFile "" not found
+ CategoryInfo : InvalidData: (:) [Invoke-ASCmd], FileNotFoundException
+ FullyQualifiedErrorId : DataValidation,Microsoft.AnalysisServices.PowerShell.Cmdlets.ExecuteScriptCommand
+ PSComputerName : localhost
InputFile "" not found
указывает, что переменные были пустыми. Они пусты, потому что вы не можете ссылаться на переменные непосредственно внутри блока скриптов. Используя Start-Job
, вы должны передать его в блок скриптов в качестве аргумента и получить его в качестве параметра внутри блока скриптов. Примерно так:
$j = Start-Job -Arg $XMLF, $Server, $output_file -ScriptBlock {
Param($XMLF, $Server, $output_file)
Invoke-ASCmd –InputFile $XMLF -Server "$Server" >$output_file
}
Что касается прогресса, так как не существует «прямого» способа измерить, насколько далеко продвинется прогресс до 100%, мы «подделываем его». Поскольку мы знаем, что выполнение занимает около 20 секунд, мы просто выполняем некоторые вычисления с использованием времени от 0 до 20 в качестве прогресса от 0 до 100:
[Math]::Min(100*($elapsedTime.Elapsed.Seconds / 20),100)
В основном используйте $elapsedTime
от 0 до 100 процентов в течение 20 секунд. Эти 20 секунд можно изменить на любое число, близкое к приблизительному времени выполнения. Используя [Math]::Min
, мы гарантируем, что если это займет больше 20 секунд, прогресс будет отображаться на 100 процентов, но статус будет продолжать показывать время. Так бы это выглядело так:
do {
write-progress -activity "Syncing..." -status "$($elapsedTime.Elapsed.ToString())" -percentcomplete ([Math]::Min(100*($elapsedTime.Elapsed.Seconds / 20),100));
Start-Sleep -Milliseconds 250
} while ($j.State -eq 'Running')