У меня возникают проблемы при попытке вызвать функцию Powershell из C #.В частности, я застреваю, пытаясь передать общий список Project в функцию модуля powershell.Вот код:
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)
}
}
}
}
Я получаю эту ошибку при попытке выполнить итерацию по массиву:
{«Свойство« Состояние »не может быть найдено для этого объекта». Убедитесь, что он существует. "}
Можно ли сделать то, что я пытаюсь сделать?
Редактировать: Некоторое время я использовал приведенный ниже код, но в конечном итоге потребляет внутренний код 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);
}
}