【问题标题】:Powershell - Export Certificate InfoPowershell - 导出证书信息
【发布时间】:2020-04-30 08:25:12
【问题描述】:

我有一个 .cer 和 .der 文件的列表,我需要记下它们的到期日期。我有以下似乎给出了到期日期,但是当我添加 export-csv 命令时它不会导出数据:

gci C:\test1 -Recurse -Filter *.cer | 
%{
    $cert = New-Object Security.Cryptography.X509Certificates.X509Certificate2 $_.FullName
    if ($cert.NotBefore -lt (Get-Date)) 
   {
        Write-Output $cert.FriendlyName
        Write-Output $cert.SubjectName
        Write-Output $cert.notbefore
        Write-Output $cert.NotAfter
    } 
}|export-csv c:\test2\test.csv -Append

如果我删除最后一部分,那么我会在屏幕上显示信息,但是当它导出到 CSV 时,我只会得到一个 #type.system.string 后跟一列“0”。 有人在这里有什么想法吗? 我知道上面只会给出“.cer”文件,我也需要找到“.der”文件,但是当我遇到它时,我会尝试越过那座桥:D

【问题讨论】:

    标签: powershell certificate export-csv


    【解决方案1】:

    不要执行Write-Output,而是创建一个PSCustomObject,然后导出为 CSV。请注意下面对 if 块的更改:

    gci C:\test1 -Recurse -Filter *.cer | 
    %{
        $cert = New-Object Security.Cryptography.X509Certificates.X509Certificate2 $_.FullName
        if ($cert.NotBefore -lt (Get-Date)) 
        {
            [PSCustomObject]@{
              FriendlyName = $cert.FriendlyName
              SubjectName = $cert.SubjectName
              NotBefore = $cert.notbefore
              NotAfter = $cert.NotAfter
            }
        } 
    }|export-csv c:\test2\test.csv -NoTypeInformation -Append -Encoding UTF8
    

    这是有效的,因为 PSCustomObject 仅具有您添加到其中的 NoteProperty 属性。如果您使用纯 HashTable 尝试过此操作,您的 CSV 将充满 HashTable 对象上存在的属性,这不是您想要的。

    现在您有了一组通用的列名,通过管道返回的每个 PSCustomObject 都是 CSV 中的一行。我已将-NoTypeInformation 添加到Export-Csv,因此它不会在转换自的PowerShell 类型之上添加注释。在大多数情况下,您不需要它,它会使一些解析器感到困惑。指定 UTF8 编码有助于一些第三方解析器的兼容性(有关更多信息,请参阅此答案的末尾),但并非绝对必要。

    不想要标题?没问题!

    如果您不想要标题,这有点棘手,但仍然相当简单。 Export-Csv 不支持不带标题的导出。您必须首先将对象转换为 CSV 格式,跳过第一行,然后自己将输出的其余部分写入文件。因此,在这种情况下,您将在 Where-Object 块之后执行以下操作:

    } | ConvertTo-Csv -NoTypeInformation | Select -Skip 1 | Set-Content -Encoding UTF8 c:\test2\test.csv
    

    在 PowerShell 6 之前,使用重定向运算符或 Set-Content 以任何编码从 PowerShell 写入文件将在文件开头包含字节顺序标记 (BOM)。我相信Export-Csv 也会这样做。您不会在大多数编辑器中看到这一点,它通常不会导致 Windows 软件出现问题,但有些 CSV 解析器会被 BOM 混淆。

    使用 UTF8 编码会有所帮助,因为 UTF8 比 PowerShell 的默认 UTF16 具有更广泛的支持,但如果您使用 PowerShell 5.1 或更早版本,请考虑使用 System.IO.File.WriteAllText 指定无 BOM 编码来写出文件。其中$csvString 是您要写入文件的 CSV 格式字符串:

    $utf8NoBOM = New-Object System.Text.UTF8Encoding( $False )
    [System.IO.File]::WriteAllText( $csvString, "C:\path\to\file.csv", $utf8NoBOM )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多