我想使用PowerShell脚本中的函数内的格式列表有一些很好格式的输出。 但是,当我使用它,它根本不打印任何东西。 在这个线程中 ,作者有同样的问题。 他被告知不要在一个函数中调用fl,而是将结果返回到main并在那里输出。
当然,将结果返回给调用者听起来似乎是一个好主意。
但是,如果函数嵌套+已经有一个返回值呢?
我想为sslstream输出证书信息。 为此,我必须使用自定义callback函数进行validation。 在这个callback函数中,证书链是可用的(并且应该被打印到屏幕上)。 该函数需要返回$ true
简化:
function write-CertDetails([System.Security.Cryptography.X509Certificates.X509Certificate]$cert){ #perform some conversions etc... eg: $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回主要function…
谢谢你的帮助
Filipp
这是棘手的。 我同意断言你不应该在函数中使用Format- cmdlet,而应该让调用者使用这些对象。
但是,如果信息仅作为callback提供,则您无法控制调用方,也不能控制函数定义,也无法传入参数,因此您无法真正解决这个问题,以便将值返回给代码。 所以我假设写屏幕真的是唯一的select。
将该值传递给fl的原因在该函数中不起作用,因为Format- cmdlet实际上并没有向屏幕写入任何内容。 他们只是格式化输出。 通常在一个函数中,这些格式对象被返回,并从任何称为该函数的函数返回,等等。 最终,如果你不在一个function,对象被写入到主机的屏幕上。
要看看这与显式写入主机有什么不同,请考虑$v = $obj | Format-List $v = $obj | Format-List vs $v = Write-Host $obj 。 后者将$obj写入屏幕, $v将为空/空。 前者将不输出任何内容, $v将包含格式对象。
所以要回答你的问题,你可以试试这个:
$certprops | Format-List | Out-Host
这应该强制它的主机没有返回任何东西,所以它不会混淆callback的返回值。 在这种情况下Write-Host将无法正常工作,因为它只显示类名称。