Импорт "библиотек" в powershell

Я нахожу, что пишу кучу связанных функций, связанных с различными существительными (кластеры, серверы sql, серверы вообще, файлы и т.д.) и помещает каждую из этих групп функций в отдельные файлы (скажем, cluster_utils.ps1, например). Я хочу иметь возможность "импортировать" некоторые из этих библиотек в свой профиль и другие в моем сеансе powershell, если они мне понадобятся. Я написал две функции, которые, кажется, решают проблему, но поскольку я только использовал powershell в течение месяца, я думал, что попрошу посмотреть, есть ли какие-либо существующие сценарии типа "лучшей практики", которые я мог бы использовать вместо этого.

Чтобы использовать эти функции, я использую dot-source (в моем профиле или в моем сеансе)... например,

# to load c:\powershellscripts\cluster_utils.ps1 if it isn't already loaded
. require cluster_utils    

Вот функции:

$global:[email protected]{}
function require([string]$filename){
      if (!$loaded_scripts[$filename]){
           . c:\powershellscripts\$filename.ps1
           $loaded_scripts[$filename]=get-date
     }
}

function reload($filename){
     . c:\powershellscripts\$filename.ps1
     $loaded_scripts[$filename]=get-date
}

Любая обратная связь будет полезна.

Ответы

Ответ 1

На основе ответа Стивена другое улучшение может заключаться в том, чтобы сразу загрузить несколько файлов:

$global:scriptdirectory = 'C:\powershellscripts'
$global:loaded_scripts = @{}

function require {
  param(
    [string[]]$filenames=$(throw 'Please specify scripts to load'),
    [string]$path=$scriptdirectory
  )

  $unloadedFilenames = $filenames | where { -not $loaded_scripts[$_] }
  reload $unloadedFilenames $path
}

function reload {
  param(
    [string[]]$filenames=$(throw 'Please specify scripts to reload'),
    [string]$path=$scriptdirectory
  )

  foreach( $filename in $filenames ) {
    . (Join-Path $path $filename)
    $loaded_scripts[$filename] = Get-Date
  }
}

Ответ 2

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

Единственное изменение, которое я сделал бы, - это сделать также расположение файла. Вы можете установить значение по умолчанию или даже использовать для этого глобальную переменную. Вам не нужно добавлять ".ps1"

$global:scriptdirectory= 'c:\powershellscripts'
$global:[email protected]{}
function require(){
      param ([string]$filename, [string]$path=$scriptdirectory)
      if (!$loaded_scripts[$filename]){
           . (Join-Path $path $filename)
           $loaded_scripts[$filename]=get-date
     }
}

function reload(){
     param ([string]$filename, [string]$path=$scriptdirectory)
     . (Join-Path $path $filename)
     $loaded_scripts[$filename]=get-date
}

Хорошие функции!

Ответ 3

Я думаю, вы найдете функциональность модулей "PowerShell v2" очень удовлетворительной. В основном заботится об этом для вас.