среда, 16 мая 2018 г.

Powershell Progress Bar


Небольшой пример организации Progress Bar. Скрипт простейший, в дополнительных пояснениях, думаю, не нуждается. Просто три вложенных цикла, в которых на консоль выводится и изменяется Progress Bar

Замечу, что параметр «ParentId» не обязательный. И в примерах я его обычно не встречал. Попробуйте запустить скрипт без него и вы увидите в чём разница. Так же обратите внимание на параметр «Completed». В этом примере я его не использую, но в реальной жизни он может пригодится для того, чтобы в какой-то момент скрыть progress bar

 Для особого шарма можно использовать «SecondsRemaining». Но я пока не понял, как его эффективно использовать. Видь мы никогда не знаем заранее время выполнения скрипта.  Подробнее о «Write-Progress» можно почитать тут: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-progress



for($a = 1; $a -lt 100; $a++ )
{
    Write-Progress -Id 1 -Activity "Main" -Status 'Progress->' -PercentComplete $a -CurrentOperation $a

    for($b = 1; $b -lt 100; $b++ )
    {
        Write-Progress -Id 2 -ParentId 1 -Activity "Sub1" -Status 'Progress->' -PercentComplete $b -CurrentOperation $b
       
        for($c = 1; $c -lt 100; $c++ )
        {
            Write-Progress -Id 3 -ParentId 2 -Activity "Sub2" -Status 'Progress->' -PercentComplete $c -CurrentOperation $c
        }
    }
}


В результате выполнения скрипта, увидите что-то вроде этого.

P.S.
Случайно заметил, что скорость исполнения этого скрипта в Powershell ISE в три раза выше чем в консоли Powershell. От битности это не зависит. Пока не понял, почему скорость выполнения разная. Кстати этот скрипт можно использовать, если есть необходимость погрузить процессор. Но конечно для генерации CPU load есть более правильные средства.

пятница, 4 мая 2018 г.

Альясы Powershell


Открыл для себя несколько замечательных альясов. Странно даже, что я раньше их не замечал.

В скриптах часто приходится использовать“Where-Object”.

Например:
Get-ChildItem -Path D:\ -Recurse | Where-Object { $_.PSIsContainer }

Вместо “Where-Object” можно использовать “?” (знак вопроса). Вышеупомянутый скрипт в этом случае приобретает следующий вид:

Get-ChildItem -Path D:\ -Recurse | ? { $_.PSIsContainer }

Обе эти записи абсолютно идентичны.

Второй альяс – это “%” знак процента. Он используется вместоForEach-Object” и “foreach”. Следующие три строки так же будут абсолютно идентичны.

  1. Get-ChildItem -Path d:\ -Recurse | ? { $_.PSIsContainer } | ForEach-Object {$_}
  2. Get-ChildItem -Path d:\ -Recurse | ? { $_.PSIsContainer } | foreach {$_}
  3. Get-ChildItem -Path d:\ -Recurse | ? { $_.PSIsContainer } | % {$_}

Список альясов можно получить командлетом Get-Alias.

P.S.
А еще вместо логического оператора -not можно использовать оператор “!” (восклицательный знак). В этом случае две нижеследующие записи будут идентичны.

  1. Get-ChildItem -Path D:\ -Recurse | Where-Object { -not $_.PSIsContainer }
  2. Get-ChildItem -Path D:\ -Recurse | Where-Object { ! $_.PSIsContainer }
P.P.S
Немного поработав с этими альясами пришел к выводу, что если скрипт укладывается в одну строчку, то восклицательный знак и знак вопроса придают строке компактность и выглядит и воспринимается лучше. Но если скрипт большой, в много строк, то Where-Object всё же читается лучше, чем непривычные знаки. Тем более, что в разных языках программирования подобные знаки имеют разные значения и порой приходится напрягаться, чтобы вспомнить их значение в данном конкретном случае.