Powershell 中的格式列表功能不起作用

Powershell 中的格式列表功能不起作用

我想在 powershell 脚本的函数中使用 format-list 来获得一些格式良好的输出。但是当我使用它时,它根本就不会打印任何内容。在此主题作者也遇到了同样的问题。他被告知不要在函数内部调用 fl,而是将结果通过管道传回 main 并在那里输出。

确实,将结果返回给调用者听起来是个好主意。

但是如果函数是嵌套的并且已经有一个返回值怎么办?

我想输出 sslstream 的证书信息。为此,我必须使用自定义回调函数进行验证。在此回调函数中,证书链可用(并且应打印到屏幕上)。该函数需要返回 $true

简化:

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)

我不知道如何将 $certprops-Collection 返回到 Main-Function...

感谢您的帮助

菲利普

答案1

嗯,这很棘手。我同意以下说法:您不应Format-在函数中使用 cmdlet,而应让调用者使用对象。

但是如果信息仅作为回调提供,您就无法控制调用者、函数定义或传入的参数,因此您无法真正解决其中的大部分问题,从而将值返回到您的代码中。因此,我假设写入屏幕确实是这里唯一的选择。

fl在函数中将值通过管道传递到不起作用的原因是, Format-cmdlet 实际上不会将任何内容写入屏幕。它们只是格式化输出。通常在函数中,这些格式对象会被返回,并从调用该函数的任何函数中返回,依此类推。最终,如果您不再处于函数中,则对象将由主机写入屏幕。

要了解这与明确写入主机有何不同,请考虑$v = $obj | Format-Listvs $v = Write-Host $obj。后者将写入$obj屏幕并且$v将为空/null。前者将不会向屏幕输出任何内容,并且$v将包含格式对象。

为了回答你的问题,你可以尝试以下方法:

$certprops | Format-List | Out-Host

这应该强制将其输出到主机而不返回任何内容,因此它不会干扰回调的返回值。Write-Host在这种情况下不会起作用,因为它只会显示类名。

相关内容