Powershell: индикатор выполнения для создаваемых папок - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь выяснить, могу ли я получить индикатор выполнения, исходя из продолжительности моего сценария или папок, которые он создает.

Рассматриваемый сценарий создает структуру большого структура папок. Я хотел бы включить индикатор выполнения в сценарий. На данный момент у меня есть следующее:

$Progress = @{
    Activity = 'Building Source Folders'
    CurrentOperation = "Verifying/Building"
    PercentComplete = 0
}

Write-Progress @Progress
$u = 0

ForEach ($f in $folders) {
$folders = Get-ChildItem C:\Source -Recurse
$u++
[int]$percentage = ($u / $folders.count)*100
$progress.CurrentOperation = "$f"
$progress.PercentComplete = $percentage

Write-Progress @Progress
}

rest of the script

Любая помощь очень важна, так как я не знаю, является ли ее использование в качестве al oop единственным способом сделать индикатор выполнения или лучше сделать это как функцию.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Я получил то, что искал, с этим кодом из https://adamtheautomator.com/building-progress-bar-powershell-scripts/:

$steps = ([System.Management.Automation.PsParser]::Tokenize($MyInvocation.MyCommand.Definition, [ref]$null) | where { $_.Type -eq 'Command' -and $_.Content -eq 'Progress-Bar' }).Count
$StepCounter = 0

function Progress-Bar {
    param(
        [int]$StepNumber,
        [string]$Message,
        [string]$Percent = "$(([math]::Round((($StepCounter)/$steps * 100)))) %"
    )

    Write-Progress -Activity 'Building TDC Source Folder Structure' -Status $Message -CurrentOperation $Percent -PercentComplete (($StepNumber / $steps) * 100)
}```

0 голосов
/ 14 февраля 2020

Я думаю, что ваша проблема в том, что у вас есть вызов Get-ChildItem внутри l oop, который не имеет смысла и не будет работать. Вытащить его наружу должно работать:

$Progress = @{
    Activity = 'Building Source Folders'
    CurrentOperation = "Verifying/Building"
    PercentComplete = 0
}

Write-Progress @Progress
$u = 0

$folders = Get-ChildItem C:\Source -Recurse

ForEach ($f in $folders) {
    $u++
    [int]$percentage = ($u / $folders.count)*100
    $progress.CurrentOperation = "$f"
    $progress.PercentComplete = $percentage

    Write-Progress @Progress
}

И в зависимости от того, сколько папок мы здесь говорим, стоит задуматься о влиянии на производительность. Write-Progress довольно медленный.

На моем компьютере 10 000 вызовов Write-Progress занимают 10 секунд с использованием этого кода:

Measure-Command {
    for( $i = 0; $i -lt 10000; $i++ ) {
        Write-Progress -Activity '' -Status "$i of 10,000" -Id 1 -PercentComplete 0
    }
}

Один из вариантов - выполнить проверку и выполнить только запись. Прогресс каждый так часто. Эта версия делает это каждые 100 итераций (то есть 100 вызовов Write-Progress), и этот код выполняется на моей машине за 0,046 секунды:

Measure-Command {
    for( $i = 0; $i -lt 10000; $i++ ) {
        # Only do a Write-Progress on every 100th loop iteration
        if( $i % 100 -eq 0 )
        {
            Write-Progress -Activity '' -Status "$i of 10,000" -Id 1 -PercentComplete 0
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...