2012-05-08 24 views
3

。ビジネスのもう1つの部分は、これにフックして、自分のindataの処理を行い、それをさらに別のシステムにプッシュすることです。周囲に尋ねると、社内にはいくつかの関係者がいますので、これらの新しいシステムを簡単に追加できるようにしたいと考えています。PowerShellの「プラグイン」システム

最初のプロトタイプシンプルは基本的に、フォルダ内のすべての.ps1のファイルを開き、そこに特別な名前を持つ関数を実行し、最善の結果を期待しています。しかし、これは改善できるようです。プラグインのようなシステムを作るためにいくつかの確立されたパワーシェルのベストプラクティスがありますか?そうでない場合、これは非常に安全な環境で実行し、新しいモジュールは、管理者がチェックインされることを考えると、私の上記の方法に問題があるのですか?

+0

私のプロトタイプをテストし続けると少し難しいことの1つは、衝突が起こる可能性があるため、関数の命名です...また、関数をロードし、スクリプトファイルに "フリー"なコードを実行しない方が望ましいです。 – 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

関連する問題