4

我们编写了一个 powershell 脚本,它处理来自内部系统的图像并将它们发送到另一个系统。现在,业务的另一部分希望与此挂钩并自己处理数据并将其推送到另一个系统。四处打听,公司周围有几个感兴趣的各方,所以我想让添加这些新系统变得简单。

第一个原型简单地打开.ps1一个文件夹中的所有文件,并在其中运行一个特别命名的函数,并希望基本上是最好的。但是,这似乎可以改进。是否有一些既定的 powershell 最佳实践来做一些类似插件的系统?如果没有,考虑到这是在一个非常安全的环境中执行的,并且管理员将签入新模块,我的上述方法有什么问题吗?

4

1 回答 1

4

你为什么不为你的主脚本使用一个配置文件,明确地告诉你要调用什么脚本和函数?像这样的东西(警告:这是从我写的东西中复制/粘贴和改编的代码。可能包含一些小故障,但这会给你一个大致的想法):

<?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
于 2012-05-09T06:41:21.953 回答