我发现自己正在编写一堆处理不同名词的相关函数(集群,sql服务器,一般服务器,文件等),并将这些函数组中的每一个放在不同的文件中(比如cluster_utils.ps1,例如)。我希望能够在我的个人资料中“导入”其中一些库,如果我需要,可以在我的PowerShell会话中“导入”其他库。我已经编写了两个似乎可以解决问题的函数,但由于我只使用了powershell一个月,我想我会问是否有任何现有的“最佳实践”类型的脚本我可以使用。 / p>
要使用这些功能,我点源(在我的个人资料或我的会话中)...例如,
# 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
}
任何反馈都会有所帮助。
答案 0 :(得分: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
}
}
答案 1 :(得分:3)
我要做的一个改变是使文件位置也成为一个参数。您可以设置默认值,甚至可以使用全局变量。您无需添加“.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
}
好的功能!
答案 2 :(得分:1)
我认为您会发现PowerShell v2的“模块”功能非常令人满意。基本上为你照顾这个。