Powershell 替换 csv 对象

Posted

技术标签:

【中文标题】Powershell 替换 csv 对象【英文标题】:Powershell replace csv object 【发布时间】:2022-01-22 03:00:07 【问题描述】:

我需要制作过期证书报告,但在替换从“certutil”导出的 csv 中的证书过期日期 OID 时遇到问题。 ForEach-Object 命令无法识别该列并替换整个 csv,但我可以使用 Where-Object 过滤模板。

$currdate = Get-Date
$date = (Get-Date).AddYears(2)
$template = "RDP|IIS"
$path = "C:\Temp\"
    if(!(test-path $path))

        New-Item -ItemType Directory -Force -Path $path

certutil -view  -restrict Disposition=20 -out "Request.CommonName,NotAfter,CertificateTemplate" csv | Out-File $path\ExpiredCerts.csv 
Import-Csv $path\ExpiredCerts.csv | ForEach-Object $_.'Certificate Template' -replace "^\d.* ","" 
Import-Csv $path\ExpiredCerts.csv |Where-Object $date -gt $_.'Certificate Expiration Date' -and $currdate -lt $_.'Certificate Expiration Date' -and $_.'Certificate Template' -match $template | ConvertTo-html -Head $Header | Out-File $path\ExpiredCerts.htm

CSV

"Request Common Name","Certificate Expiration Date","Certificate Template"
"*.piltover1.com","11/06/2022 13:08","1.3.6.1.4.1.311.21.8.9809061.13872499.9847428.7216726.9936658.242.11024705.6775621 IIS"
"*.piltover2.com","11/06/2022 13:08","1.3.6.1.4.1.311.21.8.9809061.13872499.9847428.7216726.9936658.242.11024705.6775621 IIS"
"*.piltover3.com","11/06/2022 13:08","1.3.6.1.4.1.311.21.8.9809061.13872499.9847428.7216726.9936658.242.11024705.6775621 IIS"

最终结果

$currdate = Get-Date
$date = (Get-Date).AddDays(30)
$template = "RDP|IIS"
$path = "C:\Temp\"
    if(!(test-path $path))

        New-Item -ItemType Directory -Force -Path $path

certutil -view  -restrict Disposition=20 -out "Request.CommonName,NotAfter,CertificateTemplate" csv | Out-File $path\ExpiredCerts.csv
$data = Import-csv $path\ExpiredCerts.csv
foreach ($item in $data) 
    $item.'Certificate Template' = ($item.'Certificate Template' -split ' ')[-1]

$data | Where-Object $date -gt $_.'Certificate Expiration Date' -and $currdate -lt $_.'Certificate Expiration Date' -and $_.'Certificate Template' -match $template |
        ConvertTo-Html -Head $Header | Out-File ExpiredCerts.htm

【问题讨论】:

您能否添加一个示例,说明导出文件的外观,作为纯文本(仅几行用于测试) @SantiagoSquarzon "请求通用名称","证书到期日期","证书模板" ".piltover.com","11/06/2022 13:08","1.3. 6.1.4.1.311.21.8.9809061.13872499.9847428.7216726.9936658.242.11024705.6775621 IIS"".piltover.com","11/06/2022 13:08","1.3.6.1.4.1.3.6.8.9.1.3.6.8.9 13872499.9847428.721672628.7216726.993658.2426.993658.675621 iis“* .piltover.com”,11/06/2022 13:08“,”1.3.6.1.4.1.311.21.8.9809061.1387299.984428.72167261.13872426.9428.7216726.9936658.2426。跨度> 请编辑您的问题并将所需的额外信息作为格式化文本放入其中。在评论中它变得不可读 @SantiagoSquarzon 谢谢你,为未来着想。 @SantiagoSquarzon 我已经做了一些修改,谢谢。 【参考方案1】:

您可以这样做以从“证书模板”列中删除 OID,而无需将该数据写入文件并重新导入它,从中创建一个 HTML 文件。

这假设您已经在 CSV 文件中拥有来自 certutil 的原始数据:

$data = Import-Csv -Path (Join-Path -Path $path -ChildPath 'ExpiredCerts.csv')
# remove OIDs in column 'Certificate Template'
foreach ($item in $data) 
    $item.'Certificate Template' = ($item.'Certificate Template' -split ' ')[-1]

# filter the data you need based on expiration date and template
$data | Where-Object $date -gt (Get-Date $_.'Certificate Expiration Date') -and 
                      $currdate -lt (Get-Date $_.'Certificate Expiration Date') -and 
                      $_.'Certificate Template' -match $template | 
        ConvertTo-Html -Head $Header | Set-Content (Join-Path -Path $path -ChildPath 'ExpiredCerts.htm')

附:我使用Set-Content 支持Out-File,因为我们不知道您使用的是哪个版本的PowerShell。在 PS 7.x 版中,Out-File 的默认编码是 utf8NoBOM,而在 PS 5.1 版中,默认文件编码是 unicode (= UTF16-LE),这可能不是您想要的。

【讨论】:

感谢您的帮助,它的工作!我做了一些更改以适应我的代码。为问题添加了最终结果。

以上是关于Powershell 替换 csv 对象的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell替换为错误的符号

Power Shell:需要在文件内容中放入文件具体名称

PowerShell:ConvertFrom-Json 将多个对象导出到 csv

Powershell统计邮箱账户信息

PowerShell入门学习

我们如何使用Windows Powershell脚本替换文本文件中的日期?