Класс Powershell 5, запись-отладка или запись-подробный вывод в конструкторе или методе

У меня есть класс powershell, я пытаюсь получить запись-отладку и запись-подробность для вывода при использовании нового класса Powershell 5.

Например:

class TestWriteDebug
{
    TestWriteDebug()
    {
        Write-Debug "Constructor called"
    }

    verboseOutput()
    {
        Write-Verbose "Method `"verboseOutput()`" was called"
    }
}

Я вызываю это через [TestWriteDebug]::new()

$test = [TestWriteDebug]::new()
$test.verboseOutput()

Я не могу понять, как передать флаги -debug и -verbose при создании объекта или при вызове его методов, может ли кто-нибудь сказать мне, как это должно быть реализовано?

Спасибо за вашу помощь.


person Dan Hampshire    schedule 09.09.2016    source источник


Ответы (2)


Поскольку вы вызываете их как часть выражения, самый простой способ включить их, вероятно, — с помощью Предпочтительные переменные:

$DebugPreference = 'Continue'
$VerbosePreference = 'Continue'

$test = [TestWriteDebug]::new()
$test.verboseOutput()

Чтобы сбросить их на молчание, либо выйдите из области, в которой определены эти предпочтения, либо сбросьте значения на 'SilentlyContinue'. Если вы хотите включить их в ограниченном контексте, выполните их в блоке сценария:

$test = &{$DebugPreference = 'continue'; [TestWriteDebug]::new()}
person Burt_Harris    schedule 10.09.2016

Классы действуют аналогично командлетам (т. е. поведение CmdletBinding установлено по умолчанию). Чтобы эти методы отображались, просто добавьте переключатель -Verbose или -Debug при вызове командлета, использующего этот класс.

class DemoClass {

    [string]$Name

    DemoClass([string]$Name) {
        Write-Verbose "I'm told my name is $Name"
        $this.Name = $Name
    }

    [string]GetMyName() {
        Write-Verbose "I've been asked my name"
        return "Hello, my name is $($this.Name)"
    }

}

function Invoke-NormalFunction([string]$Name) {
    $myDemo = [DemoClass]::new($Name)
    $myDemo.GetMyName()
}

function Invoke-AwesomeCmdlet {
    [CmdletBinding()]
    param([string]$Name)
    $myDemo = [DemoClass]::new($Name)
    $myDemo.GetMyName()
}

Write-Host "Normal Function:" -ForegroundColor Green
Invoke-NormalFunction('DemoBoy')

Write-Host "Cmdlet Without Verbose Switch" -ForegroundColor Green
Invoke-AwesomeCmdlet('DemoMan')

Write-Host "Cmdlet With Verbose Switch" -ForegroundColor Green
Invoke-AwesomeCmdlet('Captain Demo') -Verbose

Вывод:

Разверните приведенный ниже фрагмент, затем нажмите Run Code Snippet, чтобы просмотреть ожидаемый результат PS.

div {
    background-color: DarkBlue;
    color: LightGray;
    font-weight: Bold;
}
.verbose {color: Cyan;}
.host {color: LightGreen;}
<div class='host'>Normal Function:</div>
<div>Hello, my name is DemoBoy</div>
<div class='host'>Cmdlet Without Verbose Switch</div>
<div>Hello, my name is DemoMan</div>
<div class='host'>Cmdlet With Verbose Switch</div>
<div class='verbose'>VERBOSE: I'm told my name is Captain Demo</div>
<div class='verbose'>VERBOSE: I've been asked my name</div>
<div>Hello, my name is Captain Demo</div>

Подробнее

Если вы хотите, чтобы это вступило в силу для всего скрипта; не только те командлеты, которые вызываются с помощью соответствующего переключателя, добавьте следующее в начало файла сценария.

[CmdletBinding()]
param()
person JohnLBevan    schedule 24.03.2017