我想在 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-List
vs $v = Write-Host $obj
。后者将写入$obj
屏幕并且$v
将为空/null。前者将不会向屏幕输出任何内容,并且$v
将包含格式对象。
为了回答你的问题,你可以尝试以下方法:
$certprops | Format-List | Out-Host
这应该强制将其输出到主机而不返回任何内容,因此它不会干扰回调的返回值。Write-Host
在这种情况下不会起作用,因为它只会显示类名。