Как создать выходные параметры PowerShell (C#) - PullRequest
1 голос
/ 11 февраля 2020

Существует несколько примеров общих параметров, таких как ErrorVariable, InformationVariable;

get-item foad: -ev foo
$foo

"get-item" создаст и установит значение для $ foo для экземпляра ErrorRecord. Как я могу создать свои собственные параметры, которые делают что-то подобное?

По сути, я создаю командлет, который использует WriteObject () для записи данных в конвейер, но затем у меня также есть некоторая дополнительная информация, которую я хочу разрешить пользователям доступ - в основном из внеполосных данных - это не является частью конвейера.

Пример параметра out в C#:

public class ExampleCode
{
    public int GetMyStuff(int param1, out string someVar)
    {
        someVar = "My out-of-band result";
        return param1 + 1;
    }

    public static void RunMe()
    {
        ExampleCode ex = new ExampleCode();
        string value;
        int result = ex.GetMyStuff(41, out value);

        Console.WriteLine($"result is {result}, OOB Data is {value}");
    }
}

Я ищу о том, как преобразовать GetMyStuff () в командлет powershell.

[Cmdlet(VerbsCommon.Get, "MyStuff")]
public class ExampleCmdLet : PSCmdlet
{
    [Parameter(Mandatory = false)] int param1;
    [Parameter(Mandatory = false)] string someVar; // How to make this [out] ?
    protected override void ProcessRecord()            
    {
        someVar = "My out-of-band result";
        WriteObject(param1 + 1);
    }
}

1 Ответ

1 голос
/ 11 февраля 2020

Вы хотите установить переменную PowerShell , а не. NET.

Для доступа к переменным PowerShell требуется доступ к ним через состояние сеанса вызывающего абонента .

В System.Management.Automation.PSCmdlet -произведенных командлетах вы можете устанавливать переменные с помощью this.SessionState.PSVariable.Set(<varName>, <value>):

# Compile a Get-MyStuff cmdlet and import it into the current session.
Add-Type -TypeDefinition @'
using System.Management.Automation;

[Cmdlet(VerbsCommon.Get, "MyStuff")]
public class ExampleCmdLet : PSCmdlet
{
    [Parameter()] public int Param1 { get; set; }
    [Parameter()] public string SomeVar { get; set; }

    protected override void ProcessRecord()
    {

        // Assign to the $SomeVar variable in the caller's context.
        this.SessionState.PSVariable.Set(SomeVar, 42);

        WriteObject(Param1 + 1);
    }

}
'@ -PassThru | % Assembly | Import-Module                                                                           #'

# Call Get-MyStuff and pass the *name* of the 
# variable to assign to, "targetVariable", which sets
# $targetVariable:
Get-MyStuff -Param1 666 -SomeVar targetVariable
# Output the value of $targetVariable
$targetVariable

Вышеуказанные выходы:

667  # Output from the cmdlet, via WriteObject()
42   # Value of $targetVariable, set by Get-MyStuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...