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

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

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

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 работает внутри обычных исполняемых файлов, но как сделать то же самое в командлетах

Спасибо


person pradeep    schedule 11.08.2013    source источник


Ответы (3)


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

void ProcessRecord() {
    var line = this.MyInvocation.Line
}
person Keith Hill    schedule 11.08.2013
comment
Оба приведенных выше ответа верны и полезны для меня, помечая это как ответ, поскольку это четкий ответ на вопрос. - person pradeep; 11.08.2013

Взгляните на объект InvocationInfo, доступный как MyInvocation член на PSCmdlet. Он предоставляет такую ​​информацию, как Line, BoundParameters и т. д., которая будет вам полезна.

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

person manojlds    schedule 11.08.2013

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

Он знает только переданную строку SINGLE. Я использую ее для подсчета из конвейера в моем 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, похоже, является недостатком.

person Jeremy Bradshaw    schedule 03.04.2019