2008-11-11 5 views
13

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

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

# 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 
} 

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

+0

Возможно, вы захотите добавить их в PoshCode.org (репозиторий скриптов сообщества). – 2008-11-11 20:54:58

+0

Не был на этом сайте. Благодарю. – 2008-11-12 02:41:02

ответ

5

Опираясь на Steven's answer, другое усовершенствование может быть, чтобы позволить загрузку нескольких файлов одновременно:

$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

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

Единственное изменение, которое я сделал бы, это сделать также расположение файла. Вы можете установить значение по умолчанию или даже использовать для этого глобальную переменную. Вам не нужно добавлять «.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 
} 

Приятные функции!

1

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

Смежные вопросы