2011-11-30 8 views
5

Logオブジェクトを渡すことでPowershellスクリプトを実行するC#クラスがあります。ログはC#で完全に書かれており、共通ロギングを実現するためにC#コードとPowershellで共有する必要があります。C#のカスタムオブジェクトをPowershellに渡します。

誰かがC#のカスタムオブジェクトをPowershellに渡してそこで使う方法を教えてもらえますか?

+0

をあなただけのクラスまたはインスタンスを渡す必要がありますか? – JNK

+0

ログのインスタンス。 – naspras

答えて

1

しかし、あなたがインスタンスを共有したい場合は、(V1とV2で動作するはずです)

$lib = [System.Reflection.Assembly]::LoadFile('path to your dll'); 
$lib.Log("Terrible things have happened!") 

をアセンブリにごLogクラスをコンパイルすることでPowerShellとC#の間でクラスを共有し、PowerShellでLoadFileを使用することができますPowerShellとC#の間のクラスではSessionStateProxy.SetVariableを使用できます。

+0

Assembly.LoadFileはアセンブリを返しますので、ここに行がないと思います。 'Add-Type -Path'も考慮してください。 –

1

powershellスクリプトでクラスを使用するだけであれば、実際のC#コードをスクリプト自体に入れて、それをタイプの定義として使用できます。

There is a tutorial here.

基本的には、プロジェクトにsystem.management.automation.dllへの参照を追加し、PowerShell Classを使用Add-Type -TypeDefinition <C# code> -Language CSharp

+0

私のケースは少し異なります。 PowershellスクリプトはC#プログラムの外部にあるファイルにあり、このファイルをパラメータとしてLogで呼び出す必要があります。 – naspras

0

を使用しています。 のようなものにライン

ps.AddCommand("Get-Process"); 

を変更、それはほとんど準備ができて、そこに例を参照してください:

ps.AddCommand(<script-path/name-of-script-in-path>).AddParameter("Log", logInstance); 

それは価値があることにするインスタンスlogInstanceあるパラメータLogでスクリプトを呼び出すように指示しますスクリプトで渡されます。このスクリプトは、パラメータLogを持っており、そのコードに$Logとしてそれを使用する必要があります。

param($Log) 

$Log.Write("Begin ...") 
... 
$Log.Write("End ...") 
+0

私はこれを試してみるつもりです。 Powershellスクリプト自体から渡されたパラメータにどのようにアクセスできるのか教えてください。 – naspras

+0

@naspras - これを答えに追加しました。 –

2

私はあなたの問題を解決する実行空間を使用して、それを信じています。良い説明とその例は、http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-Cのリンクにあります。

これを使用する方法の一般的なアイデアです。

スクリプトがある場合:

param($logger2) 
$logger2.Write("logger2 Write was called"); 
$logger.Write("logger Write was called"); 

を、あなたがlogger2とロガーの使用次のコードsubsituteたい:

String scriptContent = // get script content 
Logger logger = new Logger(); 
Logger2 logger2 = new Logger2(); 
// create ps runspace 
using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    // start session 
    runspace.Open(); 
    // set variables 
    runspace.SessionStateProxy.SetVariable("logger", logger); 
    // supply commands 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     // create ps representation of the script 
     Command script = new Command(scriptContent, true, false); 
     // suppy parameters to the script 
     script.Parameters.Add(new CommandParameter("logger2", logger2)); 
     // send script to pipeline 
     pipeline.Commands.Add(script); 
     // execute it 
     Collection<PSObject> results = pipeline.Invoke(); 
     // close runspace 
     runspace.Close(); 
    } 
} 
関連する問題