Format-List no Powershell-Function não funciona

1

Eu quero usar format-list dentro de uma função em um script powershell para ter alguma saída formatada. Mas quando eu uso, simplesmente não imprime nada. Em este tópico , o autor teve o mesmo problema. Ele foi avisado para não chamar fl dentro de uma função, mas canalizar o resultado de volta para main e fazer a saída lá.

Pipar os resultados de volta para o chamador parece uma boa ideia, com certeza.

Mas e se as funções estiverem aninhadas + já tiverem um valor de retorno?

Eu quero saída de informações de certificado para um sslstream. Para fazer isso, eu tenho que usar uma função de retorno de chamada personalizada para validação. Nesta função de retorno de chamada, a cadeia de certificados está disponível (e deve ser impressa na tela). A função é necessária para retornar $ true

Simplificado:

function write-CertDetails([System.Security.Cryptography.X509Certificates.X509Certificate]$cert){
    #perform some conversions etc... e.g.:
    $certprops = new-object psobject
    $certprops | Add-Member -MemberType NoteProperty -Name "FriendlyName" -Value $Cert.FriendlyName
    $certprops | Add-Member -MemberType NoteProperty -Name "SubjectName" -Value $Cert.SubjectName

    $certprops | fl #this does not work!
}

[System.Net.Security.RemoteCertificateValidationCallback] $CertValCallback = {
param($sender, $certificate, $chain, $sslPolicyErrors)
    for($i = $chain.ChainElements.Count; $i-- -gt 0; ){
        write-CertDetails $currElement.Certificate
    }
    $true
}

# Create a TCP-Connection, open it in $tcpstream
Pseudo: $tcpstream = new-Object tcpConnection($host)
# now SSL/TLS-Handshake is performed. This calls the CertValCallback (which has to return true). New SslStream-Object is returned.
$sslStream = New-Object System.Net.Security.SslStream($tcpstream,$false,$CertValCallback)

Eu não tenho idéia, como eu deveria pegar a coleção $ certprops de volta para Main-Function ...

Obrigado pela sua ajuda

Filipp

    
por Filipp 25.06.2015 / 01:10

1 resposta

0

Hm isso é complicado. Concordo com a afirmação de que você não deve usar Format- cmdlets em funções e deve permitir que o chamador trabalhe com os objetos.

Mas se a informação está disponível apenas como um retorno de chamada, você não tem controle do chamador, nem da definição da função, nem dos parâmetros que foram passados, então você não pode trabalhar muito nisso para obter um valor de volta para o seu código. Então, suponho que escrever para a tela seja a única opção aqui.

A razão pela qual o fluxo do valor para fl não funciona na função, é que os cmdlets Format- realmente não gravam nada na tela. Eles simplesmente formatam a saída. Normalmente, em uma função, esses objetos de formato são retornados e retornados de qualquer função chamada dessa função, e assim por diante. Eventualmente, se você não estiver mais em uma função, os objetos serão gravados na tela pelo host.

Para ver como isso difere de gravar explicitamente no host, considere $v = $obj | Format-List vs $v = Write-Host $obj . O último gravará $obj na tela e $v estará vazio / nulo. O primeiro não exibirá nada na tela e $v conterá o (s) objeto (s) de formato.

Para responder à sua pergunta, você pode tentar:

$certprops | Format-List | Out-Host

Isso deve forçá-lo para o host sem retornar nada, para que ele não atrapalhe o valor de retorno do retorno de chamada. Write-Host neste caso não funcionaria porque apenas exibiria o nome da classe.

    
por 25.06.2015 / 18:39

Tags