我在嘗試從C#調用Powershell函數時遇到了問題。具體來說,我試圖將一個通用的Project列表傳遞給一個PowerShell模塊函數。代碼如下:從C#調用PowerShell(ASP.NET) - 傳遞自定義對象?
var script = @". \\server01\Modules\Runspace.ps1; Get-MyCommand";
var allProjects = _pmRepository.GetAllProjects();
using (Runspace runSpace = RunspaceFactory.CreateRunspace())
{
runSpace.Open();
PowerShell posh = PowerShell.Create();
posh.Runspace = runSpace;
posh.AddScript(script);
posh.AddArgument(allProjects);
Collection<PSObject> results = posh.Invoke();
}
GetAllProjects()方法返回Project的通用列表,Project是自定義類。我的模塊功能的簽名是這樣的:
function Get-MyCommand
{
[CmdletBinding()]
Param
(
[Parameter(ValueFromPipeline = $true)]
[PSCustomObject[]] $Projects
)
Begin
{}
Process
{
$consumables = New-GenericList "Company.Project.Entities.Project"
foreach($project in $projects)
{
if ($project.State -eq $ProjectStates.Development)
{
$consumables.Add($project)
}
}
}
}
當我嘗試迭代這個數組我得到這個錯誤:
{「屬性‘國家’不能被這個對象上找到確保它存在。「}
是否有可能做我想做的事情?
編輯: 我用了下面的代碼一段時間,但最終消耗了此Web應用程序的後端C#代碼。創建PowerShell會話的加載時間對我們的情況來說太好了。希望這可以幫助。
private void LoadConsumableProjects()
{
var results = new Collection<PSObject>();
InitialSessionState iss = InitialSessionState.CreateDefault();
iss.ImportPSModule(_modules);
using (Runspace runSpace = RunspaceFactory.CreateRunspace(iss))
{
runSpace.Open();
using (var ps = PowerShell.Create())
{
ps.Runspace = runSpace;
ps.AddScript("Get-LatestConsumableProjects $args[0]");
ps.AddArgument(Repository.GetAllProjects().ToArray());
results = ps.Invoke();
if (ps.Streams.Error.Count > 0)
{
var errors = "Errors";
}
}
}
_projects = new List<Project>();
foreach (var psObj in results)
{
_projects.Add((Project)psObj.BaseObject);
}
}
在你的腳本中,你點源'Runspace.ps1'然後調用你的函數Get-MyCommand,沒有參數你不會讓$ args? – JPBlanc
當我構建Runspace和Powershell對象時,參數被傳入。 'posh.AddArgument(allProjects);' – drohm
好的,但我在想你必須寫這樣的'var script = @「。\\ server01 \ Modules \ Runspace.ps1; Get-MyCommand $ args」;'for該參數傳遞給你的函數'Get-MyCommand' – JPBlanc