Импорт "библиотек" в 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" очень удовлетворительной. В основном заботится об этом для вас.