Как напечатать аргументы командлета powershell внутри класса командлетов

Может ли кто-нибудь помочь мне записать фактическую команду PowerShell, выданную вместе с аргументами.

У меня есть командлет, реализованный в C# следующим образом

class GetMyCommand : PSCmdlet
{
    // parameter definitions
    ...

    void processRecord()
    {
        // Here I want print actual arguments passed to the cmdlet.
    }
}

если кто-то звонит

Get-MyCommand -Name Hello -File "test.txt"

Я просто хочу записать команду в функцию processRecord.

 "Get-MyCommand -Name Hello -File "test.txt""

Я ясно знаю имя командлета, но не знаю, как распечатать точную строку аргументов.

Environment.CommandLine работает внутри обычных exe, но как сделать то же самое в командлетах

Спасибо

2 ответа

Решение

Использовать MyInvocation.Line собственность на PSCmdlet например:

void ProcessRecord() {
    var line = this.MyInvocation.Line
}

Посмотрите на InvocationInfo объект доступен как MyInvocation член на PSCmdlet, Это обеспечивает информацию как Line, BoundParameters и т.д., которые будут вам полезны.

http://msdn.microsoft.com/en-us/library/system.management.automation.invocationinfo_members(v=vs.85).aspx

Я добавлю предостережение в $PSCmdlet.MyInvocation.Line:

Он знает только ОДНУ строку, которая была передана. Я использую ее, чтобы получить счет из конвейера в моем сценарии Get-MailboxTrustee.ps1, и я обнаружил, что, хотя это отлично работает:

$Mailboxes | .\Get-MailboxTrustee.ps1

Это не так:

$Mailboxes |
.\Get-MailboxTrustee.ps1

Если вы проверите $PSCmdlet.MyInvocation.Line во втором примере, вы увидите, что это просто:

.\Get-MailboxTrustee.ps1 (полностью отсутствует $Mailboxes | <new line> часть моей команды)

Жаль, что нет $PSCmdlet.MyInvocation.Line [s]. Мы знаем, что PowerShell явно знает об этом, поэтому реализация $PSCmdlet, похоже, там, где его не хватает.

Другие вопросы по тегам