Um efeito útil da distinção entre Write-Host
e Write-Output
é que você pode inserir o log ( Write-Host
) em suas funções sem atrapalhar os valores que eles realmente retornam para seus chamadores ( Write-Output
).
Por falar em retornar aos chamadores, simplesmente deixar um valor sair de uma expressão ou chamada de cmdlet o transmitirá como saída. Portanto, 5
em uma linha por si só e Write-Output 5
são equivalentes. Um conceito um tanto complicado é que os scripts do PowerShell não têm valores de retorno no mesmo sentido que a maioria das linguagens de programação. Retornar um valor com a palavra-chave Return
é indistinguível de permitir o valor do pipeline de saída e, em seguida, sair da função. Em outras palavras, 5; break
é o mesmo que Return 5
. A saída do script (que pode ser vários objetos) é o valor de retorno.
Objetos que saem de blocos de script registrados como ações de evento são automaticamente escondidos na propriedade Output
do objeto de trabalho do evento, que é o que você recebe de Register-ObjectEvent
se você usar -Action
para fornecer um bloco de script . Aqui está um script de exemplo que registra a data e a hora atuais toda vez que um timer é disparado:
$timer = New-Object System.Timers.Timer
$timer.Interval = 2000
$myEvent = Register-ObjectEvent $timer -EventName 'Elapsed' -Action {Get-Date}
$timer.Start()
A variável $myEvent
receberá o objeto de trabalho de Register-ObjectEvent
. $myEvent.Output
será uma matriz cada vez maior de vezes, uma de cada execução de Get-Date
no manipulador de eventos. (Há alguns definidos automaticamente variáveis que podem ser úteis em tais manipuladores.) No seu caso, uma vez terminado o que for feito gerando os retornos de chamada, você poderá gerar $ect.Output
para passar os dados capturados para o script de chamada.
Como alternativa, se você não deseja lidar com manipuladores de eventos personalizados, pode deixar o bloco de script e, em vez disso, fornecer um identificador de origem que nomeie a assinatura do evento. Poderíamos substituir a linha $myEvent
do exemplo anterior por:
Register-ObjectEvent $timer -EventName 'Elapsed' -SourceIdentifier 'MyEvent'
Agora, os eventos entram na fila de eventos, marcados com nosso identificador de origem. Para recuperá-los mais tarde, usamos Get-Event
:
Get-Event -SourceIdentifier 'MyEvent'