2012-05-08 48 views
3

我们已经写了一个PowerShell脚本从一个内部系统处理图像,并将它们发送到另一个系统。现在,企业的另一部分想要将这个问题挂钩并自己处理indata,并将其推向另一个系统。问问周围,公司有几个有利益关系的团体,所以我想简单地添加这些新系统。PowerShell的“插件”系统

第一个原型简单的打开文件夹中的所有文件.ps1并在那里经营一家专门命名的功能,并希望最好的,基本上是这样。但是,这似乎可以改善。是否有一些建立PowerShell最佳做法来做一些类似插件的系统?如果不是这样,由于这是在一个相当安全的环境中执行的,并且新模块将由管理员签入,所以我的上述方法是否存在任何问题?

+0

有一件事情是有点棘手,因为我继续测试我的原型是函数的命名,因为可能有冲突......此外,宁愿只装载功能,在脚本文件中不执行任何“免费”的代码。 – carlpett

回答

3

你为什么不使用配置文件用于主脚本,明确地告诉调用哪个脚本,什么功能?像这样的东西(警告:这是复制/粘贴,并从东西我写改编代码可能包含一些小问题,但是这给你的总体思路):

<?xml version="1.0"?> 
<configuration> 
    <Plugins> 
    <Plugin Path="c:\blah\plugin1.ps1" PowerShellFunction="My-Plugin-Function" /> 
    </Plugins> 
</configuration> 

在主脚本:

function Load-Plugins 
{ 
    param (
     [parameter(Mandatory = $true)][xml] $config, 
     [parameter(Mandatory = $true)][string] $nodeType 
    ) 

    $plugins = @{} 

    foreach ($pluginNode in $config.SelectNodes($nodeType)) 
    { 
     if ($pluginNode) 
     { 
      $Path = $pluginNode.Path 
      $powerShellFunction = $pluginNode.PowerShellFunction 

      $plugin = New-Object Object | 
       Add-Member -MemberType NoteProperty -Name "Path" -Value $Path -PassThru | 
       Add-Member -MemberType NoteProperty -Name "PowerShellFunction" -Value $powerShellFunction -PassThru 

      $plugins[$Path] = $plugin 
     } 
    } 

    return $plugins 
} 


function Execute-Plugins 
{ 
    param (
     [parameter(Mandatory = $true)][hashtable] $plugins 
    ) 

    $Error.Clear() 

    if (!$plugins.Values) 
     { return } 

    foreach ($plugin in $plugins.Values) 
    { 
     & .\$plugin.Path 
     Invoke-Expression "$($plugin.PowerShellFunction)" 
    } 
} 


function Load-Script-Config 
{ 
    param (
     [parameter(Mandatory = $false)][string] $configFile 
    ) 

    if (!$configFile) 
     { $configFile = (Get-PSCallStack)[1].Location.Split(':')[0].Replace(".ps1", ".config") } 

     return [xml](Get-Content $configFile) 
} 

$pluginConfig = Load-Script-Config 
$plugins = Load-Plugins $config "configuration/Plugins/Plugin" 
Execute-Plugins $plugins 
+0

优秀的解决方案,谢谢! – carlpett