Вызов Powershell из C # (ASP.NET) - передать пользовательский объект? - PullRequest
0 голосов
/ 16 сентября 2011

У меня возникают проблемы при попытке вызвать функцию 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);
        }
    }

1 Ответ

1 голос
/ 16 сентября 2011

Хорошо, я поставил это как ответ, потому что, я думаю, вы можете проверить это. Как я понимаю ваш код, вы передаете аргумент в ваш скрипт:

posh.AddArgument(allProjects);

Но внутри вашего скрипта вы не используете этот аргумент для передачи вашей функции. Для меня вы можете проверить:

var script = @". \\server01\Modules\Runspace.ps1; Get-MyCommand $args[0]";

В вашем скрипте вы указываете источник 'Runspace.ps1' и затем вызываете свою функцию Get-MyCommand без параметров. PowerShell попадает в цикл foreach с $ project равным нулю. Просто подайте звуковой сигнал, если $ Projects равен нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...