Импорт "библиотек" в powershell - PullRequest
13 голосов
/ 11 ноября 2008

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

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

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

Вот функции:

$global:loaded_scripts=@{}
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
}

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

Ответы [ 3 ]

5 голосов
/ 16 ноября 2008

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

$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
  }
}
3 голосов
/ 11 ноября 2008

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

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

$global:scriptdirectory= 'c:\powershellscripts'
$global:loaded_scripts=@{}
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
}

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

1 голос
/ 25 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...