Powershell - Можете ли вы использовать пользовательский тип объекта для параметров функции? - PullRequest
1 голос
/ 16 сентября 2011

У меня есть функция, определенная следующим образом:

function Get-LatestProjects
{
    [CmdletBinding()]
    Param
    (
        [Parameter(ValueFromPipeline = $true, Position = 0)]
        [Company.Project.Entities.Project[]] $Projects
    )
    Begin {}
    Process
    {
        ...
    }
    End {}
}

Я вызываю эту функцию из C #, и параметр в коде является массивом этого типа, но я получаю эту ошибку:

Невозможно обработать преобразование аргумента для параметра «Проекты». Невозможно преобразовать значение "Company.Project.Entities.Project []" типа "Company.Project.Entities.Project []" в тип "Company.Project.Entities.Project".

Код C #, который делает вызов:

var script = @". \\server01\Runspace.ps1; Get-LatestProjects $args";
var args = _pmRepository.GetAllProjects().ToArray(); // GetAllProjects returns List<Project>

using (Runspace runSpace = RunspaceFactory.CreateRunspace())
{
    runSpace.Open();
    var ps = PowerShell.Create();
    ps.Runspace = runSpace;
    ps.AddScript(script);
    ps.AddArgument(args);

    Collection<PSObject> results = ps.Invoke();
    ...
}

Нужно ли делать какие-либо преобразования объектов, прежде чем передать их в функцию powershell? Или я не могу добавить ограничение типа в функцию powershell для параметра $ Projects?

1 Ответ

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

Похоже, _pmRepository.GetAllProjects () возвращает только один проект.Разве вы не можете просто объявить $ Projects без типа и использовать $ Projects.gettype для просмотра типа.

function Get-LatestProjects
{
    [CmdletBinding()]
    Param
    (
        [Parameter(ValueFromPipeline = $true, Position = 0)]
        $Projects
    )
    Begin {
       #Set-Content -path c:\temp\debug.txt -value $Projects.Gettype()
       $projects | get-member -force | out-file -filepath c:\temp\debug.txt
    }
    Process
    {
        for ($i=0 ; $i -le $projects.count ; $i++)
        {
           $projects[$i].State  | out-file  -filepath c:\temp\debug.txt -append
        }
    }
    End {}
}

---- Отредактировано ------

Вы можете избежать переноса массива в другой массив, написав.

var script = @". \\server01\Runspace.ps1; Get-LatestProjects $args[0]";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...