Поделиться через


Рекомендации по разработке модуля PowerShell

В этом документе содержатся некоторые рекомендации, связанные с тем, как модуль создается для оптимальной производительности.

Разработка манифеста модуля

Манифест модуля, который не использует следующие рекомендации, может заметно повлиять на общую производительность PowerShell, даже если модуль не используется в сеансе.

Команда автоматического обнаружения анализирует каждый модуль, чтобы определить, какие команды экспортирует модуль, и этот анализ может быть дорогостоящим. Результаты анализа модулей кэшируются на пользователя, но кэш недоступен при первом запуске, что является типичным сценарием с контейнерами. При анализе модуля, если экспортированные команды можно полностью определить из манифеста, можно избежать более дорогого анализа модуля.

Руководящие принципы

  • В манифесте модуля не используйте подстановочные знаки в записях AliasesToExport, CmdletsToExportи FunctionsToExport.

  • Если модуль не экспортирует команды определенного типа, укажите это явно в манифесте, указав @(). Запись $null или её отсутствие эквивалентна указанию подстановочного знака *.

Если это возможно, следует избежать следующих действий.

@{
    FunctionsToExport = '*'

    # Also avoid omitting an entry, it's equivalent to using a wildcard
    # CmdletsToExport = '*'
    # AliasesToExport = '*'
}

Вместо этого используйте:

@{
    FunctionsToExport = 'Format-Hex', 'Format-Octal'
    CmdletsToExport = @()  # Specify an empty array, not $null
    AliasesToExport = @()  # Also ensure all three entries are present
}

Избегайте CDXML

При выборе способа реализации модуля существует три основных варианта:

  • Двоичный (обычно C#)
  • Скрипт (PowerShell)
  • CDXML (XML-файл с оболочкой CIM)

Если важна скорость загрузки вашего модуля, CDXML примерно на порядок медленнее, чем двоичный модуль.

Двоичный модуль загружается быстрее всего, так как он компилируется заранее и с применением NGen может выполнять JIT-компиляцию по одному разу на каждом компьютере.

Модуль скрипта обычно загружает немного медленнее, чем двоичный модуль, так как PowerShell должен проанализировать скрипт перед компиляцией и выполнением этого модуля.

Модуль CDXML обычно гораздо медленнее скриптового модуля, так как он должен сначала проанализировать XML-файл, который генерирует значительное количество скрипта PowerShell, после чего оно анализируется и компилируется.