Импорт-модуль PowerShell vs Dot Sourcing

Если я хочу отделить некоторые из своих функций от моего основного PowerShell script, я могу либо написать это как файл .ps1 file и dot source, либо я могу создать это как .psm1 и импортировать используя Import-Module.

Какой из них лучше и почему?

Ответ 1

Модули лучше всего подходят для библиотек. Они дают вам больше контроля над тем, что экспортируется из модуля. Это по умолчанию все переменные script в файле PSM1 являются закрытыми - не видны вне модуля при импорте. Аналогично, все функции являются общедоступными. Однако вы можете использовать Export-ModuleMember в вашем файле PSM1, чтобы точно контролировать, какие переменные, функции, псевдонимы, командлеты и т.д. Вы экспортируете из своего модуля. Модули также можно удалить из сеанса, что является существенным отличием от dotsourcing.PS1 script. Другое отличие состоит в том, что функции модуля являются именами, размещаемыми модулем, в котором они находятся, поэтому вы можете легко получить доступ к одинаково названным модулям, предварительно указав имя модуля и "\" на имя функции, например. PSCX\Get-Uptime. В ISE этот префикс также вызывает поддержку intellisense.

Я вообще рекомендую ходить с модулями.: -)

Ответ 2

Dotsourcing + script и модули - это две разные вещи. Модули отлично подходят для сбора/группировки функций и командлетов, которые вы использовали бы в script. Если у вас есть функции, которые вы хотите использовать в интерактивном режиме (вы вызываете функцию в консоли), тогда модуль может отлично подходить.

Если у вас есть один большой script, с которым вы запускаете, скажите "перенести общий ресурс файла" или один script, который вы называете регулярным, используя Task Scheduler, а затем dot-sourcing проще.

Это зависит от того, что вам нужно. Реферат:

  • Если вы просто используете функции/скрипты в ЭТОЙ ситуации (script/job) = используйте источник точки.
  • Если вы используете общие функции / script, которые также используются в других сценариях, или вы хотите вызвать некоторые из функций в интерактивном режиме и т.д. = использовать модуль.

Ответ 3

Несколько дополнительных функций модуля в дополнение к другим ответам.

  • В PowerShell V3 не нужно вызывать Import-Module, чтобы использовать экспортированные команды. Это особенно полезно, когда команды используются в интерактивном режиме. PowerShell как-то кэширует и знает все доступные команды модуля и даже их помощь Get-Help SomeCommand (это не так для справки модуля Get-Help about_SomeModule, хотя).

  • Существует несколько тонких различий в поведении функций с точками и функции модуля script. Перечислить их все непросто, вот только один пример: Странное поведение с областью и модулями переменных Scriptblock Powershell, любые предложения? Иногда использование модулей script становится болезненным, особенно когда вы обнаруживаете нежелательные различия и проблемы слишком поздно, то есть простые вещи прекрасно работают в начале разработки, но сложные вещи начинают ошибаться позже.

В целом, обычно я использую модули, кроме случаев, когда они плохо работают. Один из них вызывает пользовательские блоки script, переданные в модульных функциях script.