Ускорение сценариев PowerShell в V2? - PullRequest
2 голосов
/ 12 мая 2010

Я использую несколько скриптов, использующих PowerShell V2, и заметил долгую паузу при первой загрузке окна консоли. Что я могу сделать, чтобы улучшить производительность моих скриптов?

Спасибо, MagicAndi

Ответы [ 4 ]

7 голосов
/ 12 мая 2010

Кроме минимизации того, что вы вкладываете в различные скрипты своего профиля (показано ниже), вы мало что можете сделать:

C:\PS> $profile | fl * -force


AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : C:\Users\hillr\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\hillr\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Один из способов проверить, не вызывают ли задержки сценарии профиля, - запустить powershell с помощью параметра -noprofile. Если время запуска отличается, это будет связано со сценариями вашего профиля. Вы можете использовать секундомер .NET так:

function TimeThis([scriptblock]$scriptblock, $msg)
{
    if (!$stopWatch)
    {
        $script:stopWatch = new-object System.Diagnostics.StopWatch
    }
    $stopWatch.Reset()
    $stopWatch.Start()
    . $scriptblock
    $stopWatch.Stop()
    if ($msg -eq $null) { $msg = "$scriptblock" }
    "Execution time: $($stopWatch.ElapsedMilliseconds) mS for $msg"
}

. TimeThis {Import-Module $Module -args ~\Pscx.UserPreferences.ps1}

Хотя вы можете использовать Measure-Command, он не показывает, что выполняется, и вы не получаете вывод команды (только время очень многословно).

Раньше в более ранних CTP-файлах возникала проблема, когда установщик не генерировал сборки PowerShell, что могло привести к заметным задержкам загрузки. Тем не менее, я почти уверен, что это было исправлено с момента последней установки 2.0 (и, конечно, с PowerShell, встроенным в Windows 7 и Windows Server 2008 R2). Если существует следующий каталог и его содержимое, вы должны быть ngen'd:

dir 'C:\Windows\assembly\NativeImages_v2.0.50727_32\Microsoft.PowerShel#' -r
3 голосов
/ 14 мая 2010

Отследить проблему с производительностью, как это, может быть сложно, но есть несколько вещей, которые вы можете сделать, чтобы улучшить / исправить вещи.

Во-первых, запуск PowerShell холодный или теплый. По крайней мере, на моей рабочей станции, когда я в первый раз запускаю PS утром, запуск занимает немного больше времени, чем в последующие. Есть ли способ сохранить тепло, чтобы минимизировать время загрузки?

Во-вторых, используйте такой инструмент, как Process Monitor от опытных людей, работающих на Windows Sysinternals . Установите его, чтобы отслеживать процесс powershell.exe и видеть, что он делает так долго. Для меня у меня есть несколько подключенных сетевых дисков и общих сценариев, которые получают из сети. В моем тестировании я измерял задержку запуска примерно на две секунды для каждого удаленного скрипта, который я загружал.

PowerShell необходимо загружать кучу ресурсов с диска в память, поэтому само собой разумеется, что оптимальное функционирование вашей системы ввода-вывода также поможет. Дефрагментируйте, убедитесь, что у вас достаточно свободной оперативной памяти и т. Д. Он даже запрашивает довольно мало информации из реестра, поэтому вы можете убедиться, что ваш реестр полностью дефрагментирован - хотя это довольно длинный путь.

0 голосов
/ 30 декабря 2012

использовать встроенное ускорение C # x100 max

Add-Type -Language CSharpVersion3 @ "

"@

Add-Type @ "

"@

если не может использовать -TypeDefinition @ "

использовать 32-битную PowerShell

ускорение х1,5

ps-run.cmd:

SET PS32 =% windir% \ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell

% PS32%. \% *

0 голосов
/ 18 мая 2010

Это может быть совершенно не связано, но у меня однажды была большая пауза во время запуска PowerShell.

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

Перезагрузка машины помогла в этом случае. Также это не всегда происходит (на самом деле, пока только один раз).

...