如何使用 Where-Object 过滤输出?

时间:2021-03-22 12:15:47

标签: powershell

我正在尝试获取有关 Windows 2019 上的应用程序证书的一些信息(名称和到期日期):

Get-AdfsRelyingPartyTrust | ?{$_.EncryptionCertificate} `
| Select-Object name,
@{n="CertificateExpiration";e={($_ | Select-Object EncryptionCertificate -ExpandProperty EncryptionCertificate).notafter}} | Sort-Object CertificateExpiration

输出:

Script output 1

但是如果我只想获得那些在不久的将来(例如 30 天)到期的证书怎么办? 试图像这样过滤,但没有成功:

Get-AdfsRelyingPartyTrust | ?{$_.EncryptionCertificate} `
| Select-Object name,
@{n="CertificateExpiration";e={($_ | Select-Object EncryptionCertificate -ExpandProperty EncryptionCertificate).notafter}} | Sort-Object CertificateExpiration `
| Where-Object ($_.CertificateExpiration - (Get-Date)).Days -le '30'

(输出相同)

1 个答案:

答案 0 :(得分:2)

  1. [DateTime] minus [DateTime] 为您提供 [TimeSpan] 对象,它代表周期。转换为数字 [Int] 时,它使用 ticks,即 0.0001 秒。要使用某些时间单位(如天),您应该使用 .TotalDays

  2. 由于类型转换,转换为字符串 -le '30' 可能很危险。使用数字,而不是字符串:-le 30

  3. [DateTime]::Today[DateTime]::Now 而不是你正在做的 Get-Date 可能更好;)


示例:

Get-ChildItem 'Cert:\LocalMachine\My' | 
  Where-Object {$_.HasPrivateKey -eq $true} |
  Where-Object {($_.NotAfter - [DateTime]::Today).TotalDays -gt 30}

我建议使用“$warningDate”变量代替计算差异:

$warningDate = [DateTime]::Today.AddDays(30)
$warnedCerts = @(Get-ChildItem 'Cert:\LocalMachine\My' | 
   Where-Object {$_.NotAfter -le $warningDate})  # Use @() to force array if you're not sure on number of elements returned)