某些结果的输出格式-表格线颜色

Rap*_*uza 1 powershell

我运行下面的代码,它的工作原理:

Get-ChildItem -Path T: -Filter *.pfx | ForEach-Object { 
    Import-PfxCertificate -FilePath $_.FullName -CertStoreLocation Cert:\CurrentUser\My -Password ****** -Force -AsPlainText) -Exportable 
} |
Format-Table -Property @{Label="Computador"; Expression={$env:computername}},
    @{Label="Nome"; Expression={$_.FriendlyName}},
    @{Label="Validade"; Expression={$_.NotAfter}},
    @{Label="Impressão digital"; Expression={$_.Thumbprint}} -AutoSize
Run Code Online (Sandbox Code Playgroud)

我试图用红色的过期证书来写每一行。如果我试试这个:

Get-ChildItem -Path T: -Filter *.pfx | ForEach-Object { 
    Import-PfxCertificate -FilePath $_.FullName -CertStoreLocation Cert:\CurrentUser\My -Password ****** -Force -AsPlainText) -Exportable 
} |
Format-Table -Property @{Label="Computador"; Expression={$env:computername}},
    @{Label="Nome"; Expression={$_.FriendlyName}},
    @{Label="Validade"; Expression={$_.NotAfter}},
    @{Label="Impressão digital"; Expression={$_.Thumbprint}} -AutoSize |
Out-String | Write-Host -ForegroundColor Red
Run Code Online (Sandbox Code Playgroud)

所有线条都变成红色。如果我尝试将 $_ 值传递给 If,控制台会说这是一个 Null 值。

有什么建议?


我想做的事情的解决方案是由 mklement0 提供的。如果有人有同样的问题,我会留下我在这里所做的:

Get-ChildItem -Path T: -Filter *.pfx | ForEach-Object {
Import-PfxCertificate -FilePath $_.FullName -CertStoreLocation Cert:\CurrentUser\My -Password ****** -Force -AsPlainText) -Exportable
            } | Format-Table -Property @{Label="Computador"; Expression={$env:computername}}, @{Label="Nome"; Expression={$_.FriendlyName}}, @{Label="Validade"; Expression={$_.NotAfter}}, @{Label="Status"; Expression={if (($_.NotAfter).subtract([DateTime]::Now).days -lt 0){"Expirado"} elseif (($_.NotAfter).subtract([DateTime]::Now).days -lt 30){"Expirando"}}},@{Label="Impressão digital"; Expression={$_.Thumbprint}} -AutoSize | Out-String -Stream |
            ForEach-Object {
                $fgArg = if ($_ -match 'Expirado') { @{ 'BackgroundColor' = 'Red'; 'ForegroundColor' = 'Black'} } elseif ($_ -match 'Expirando') { @{ 'BackgroundColor' = 'Yellow'; 'ForegroundColor' = 'Black'} } else { @{} }
                Write-Host @fgArg $_
            }
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 6

关键是使用Out-String-Stream开关可以逐行处理;默认情况下,Out-String输出单个多行字符串。

这是一个简单的示例,它将包含子字符串的行标记expired为红色(在 PowerShell 中通常情况下,默认情况下匹配不区分大小写):

'A valid certificate', 'An expired certificate', 'A valid certificate' | 
   Out-String -Stream | ForEach-Object {
     $fgArg = if ($_ -match 'expired') { @{ 'ForegroundColor' = 'Red' } } else { @{} }
     Write-Host @fgArg $_
   }
Run Code Online (Sandbox Code Playgroud)

以上产生:

在此处输入图片说明


如果你正在寻找此功能打包成一个先进的功能,请参阅功能
Out-HostColored这个答案我的。