我有一個C#類,它應該通過傳遞一個Log對象來執行一個Powershell腳本。日誌完全用C#編寫,並且應該在C#代碼和Powershell之間共享,以實現通用日誌記錄。從C#傳遞一個自定義對象到Powershell
有人能告訴我如何將自定義對象從C#傳遞到Powershell並在那裏使用它?
我有一個C#類,它應該通過傳遞一個Log對象來執行一個Powershell腳本。日誌完全用C#編寫,並且應該在C#代碼和Powershell之間共享,以實現通用日誌記錄。從C#傳遞一個自定義對象到Powershell
有人能告訴我如何將自定義對象從C#傳遞到Powershell並在那裏使用它?
您可以通過編輯您的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
。
Assembly.LoadFile返回一個程序集,所以我認爲這裏缺少一行。另外考慮'Add-Type -Path'。 –
如果您只需要在powershell腳本中使用該類,則可以將實際的C#
代碼放入腳本本身,並將其用作類型的定義。
基本上你使用Add-Type -TypeDefinition <C# code> -Language CSharp
我的情況有點不同。 Powershell腳本位於C#程序之外的文件中,我需要使用Log作爲參數調用此文件。 – naspras
的參考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 ...")
我要試試這個。您能否告訴我如何從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和記錄器使用下面的代碼:
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
Log的一個實例。 – naspras