4

内部システムからの画像を処理して別のシステムに送信するPowerShellスクリプトを作成しました。今度は、ビジネスの別の部分がこれに接続し、独自のindata処理を実行して、それをさらに別のシステムにプッシュしたいと考えています。周りに聞いてみると、会社の周りには関係者が何人かいるので、これらの新しいシステムを簡単に追加できるようにしたいと思います。

最初のプロトタイプ.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 に答える