13

我发现自己正在编写一堆相关的函数来处理不同的名词(集群、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
}

任何反馈都会有所帮助。

4

3 回答 3

5

基于Steven 的回答,另一个改进可能是允许一次加载多个文件:

$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
  }
}
于 2008-11-16T15:01:20.517 回答
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
}

不错的功能!

于 2008-11-11T20:52:41.050 回答
1

我想您会发现 PowerShell v2 的“模块”功能非常令人满意。基本上会为您解决这个问题。

于 2008-11-24T21:48:35.980 回答