2011-11-30 78 views
5

我有一個C#類,它應該通過傳遞一個Log對象來執行一個Powershell腳本。日誌完全用C#編寫,並且應該在C#代碼和Powershell之間共享,以實現通用日誌記錄。從C#傳遞一個自定義對象到Powershell

有人能告訴我如何將自定義對象從C#傳遞到Powershell並在那裏使用它?

+0

你只需要通過類或實例? – JNK

+0

Log的一個實例。 – naspras

回答

1

您可以通過編輯您的Log類爲一個程序集共享PowerShell和C#之間的類,並在PowerShell中使用LoadFile(應在V1和V2工作)

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

但是,如果你想分享一個實例PowerShell和C#之間的類可以使用SessionStateProxy.SetVariable

+0

Assembly.LoadFile返回一個程序集,所以我認爲這裏缺少一行。另外考慮'Add-Type -Path'。 –

1

如果您只需要在powershell腳本中使用該類,則可以將實際的C#代碼放入腳本本身,並將其用作類型的定義。

There is a tutorial here.

基本上你使用Add-Type -TypeDefinition <C# code> -Language CSharp

+0

我的情況有點不同。 Powershell腳本位於C#程序之外的文件中,我需要使用Log作爲參數調用此文件。 – naspras

0

的參考system.management.automation.dll添加到您的項目並使用PowerShell Class。 見的例子有,這幾乎是準備好了,改線

ps.AddCommand("Get-Process"); 

喜歡的東西:

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

它講述與參數Log其值是一個實例logInstance是調用腳本通過腳本傳遞。該腳本應該有參數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和記錄器使用下面的代碼:

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(); 
    } 
} 
相關問題