Logオブジェクトを渡すことでPowershellスクリプトを実行するC#クラスがあります。ログはC#で完全に書かれており、共通ロギングを実現するためにC#コードとPowershellで共有する必要があります。C#のカスタムオブジェクトをPowershellに渡します。
誰かがC#のカスタムオブジェクトをPowershellに渡してそこで使う方法を教えてもらえますか?
Logオブジェクトを渡すことでPowershellスクリプトを実行するC#クラスがあります。ログはC#で完全に書かれており、共通ロギングを実現するためにC#コードとPowershellで共有する必要があります。C#のカスタムオブジェクトをPowershellに渡します。
誰かがC#のカスタムオブジェクトをPowershellに渡してそこで使う方法を教えてもらえますか?
しかし、あなたがインスタンスを共有したい場合は、(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
を使用できます。
Assembly.LoadFileはアセンブリを返しますので、ここに行がないと思います。 'Add-Type -Path'も考慮してください。 –
powershellスクリプトでクラスを使用するだけであれば、実際のC#
コードをスクリプト自体に入れて、それをタイプの定義として使用できます。
基本的には、プロジェクトにsystem.management.automation.dllへの参照を追加し、PowerShell Classを使用Add-Type -TypeDefinition <C# code> -Language CSharp
私のケースは少し異なります。 PowershellスクリプトはC#プログラムの外部にあるファイルにあり、このファイルをパラメータとしてLogで呼び出す必要があります。 – naspras
を使用しています。 のようなものにライン
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 ...")
私はこれを試してみるつもりです。 Powershellスクリプト自体から渡されたパラメータにどのようにアクセスできるのか教えてください。 – naspras
@naspras - これを答えに追加しました。 –
私はあなたの問題を解決する実行空間を使用して、それを信じています。良い説明とその例は、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();
}
}
をあなただけのクラスまたはインスタンスを渡す必要がありますか? – JNK
ログのインスタンス。 – naspras