获取实际时间与不取值后的时间差

时间:2019-05-13 11:48:56

标签: powershell ssl

我在CentOS上使用以下powershell脚本获取证书ssl的更新日期,并且我想获取更新日期和实际日期之间的时间差,而我不知道如何完成。我尝试了以下代码,但它不起作用,它显示了以下错误

  

New-TimeSpan:无法将“ System.Object []”转换为类型“ System.DateTime”   参数“结束”要求。不支持指定的方法。

下面是我编写的代码

$certsdir = '/etc/ssl/certs/'
$files = Get-ChildItem -File -Path $certsdir
foreach ($file in $files) { 
# Nom du fichier avec extension
$fullname = $file.Name

# Extension du fichier
$extension = $file.Extension
Write-Host $extension

# Nom du fichier sans extension
$filename = $file.BaseName
Write-Host $filename

if ($extension -eq ".crt") {
    Write-Host "ok"
    openssl x509 -inform p7b -in /etc/ssl/certs/$fullname -out $(Join-Path - 
    Path $certsdir -ChildPath "$filename.pem")
    $vars = "$filename.pem"
    $vice = get-childitem /etc/ssl/certs/$vars
    Write-Host ((& openssl x509 -in $vice -dates -noout) -match 'notAfter')
    }
    elseif ($extension -eq ".der") {
    Write-Host "ok"
    openssl x509 -inform p7b -in /etc/ssl/certs/$fullname -out $(Join-Path - 
    Path $certsdir -ChildPath "$filename.pem")
    $vars = "$filename.pem"
    $vice = get-childitem /etc/ssl/certs/$vars
    $timessl = ((& openssl x509 -in $vice -dates -noout) -match 'notAfter')
    $timenow = Get-Date
    $diff = New-TimeSpan -Start $timenow -End $timessl 
    Write-Host $diff

}
}

1 个答案:

答案 0 :(得分:1)

当您将-match array [1] 用作LHS时,结果始终都是一个数组-即使只有 元素匹配。

因此,必须将所得的单元素数组的第一个元素传递给New-TimeSpan

$diff = New-TimeSpan -Start $timenow -End $timessl[0]

鉴于$timessl[0]包含字符串,该命令仅在New-TimeSpan识别出该字符串的日期/时间格式时才有效。

在您的情况下,如您在评论中所述,$timessl[0]包含类似
的内容 notAfter=Feb 7 16:10:41 2021 GMT,不能直接识别( (即使没有notAfter=部分),因此您必须显式地解析字符串,分别为AdminOfThingsTheo建议:

$diff = New-TimeSpan -Start $timenow -End [datetime]::ParseExact(
  ($timessl[0] -replace '^notAfter='), 
  'MMM d HH:mm:ss yyyy GMT',
   [cultureinfo]::InvariantCulture
) 

[1]当您从外部程序捕获(stdout)输出并且该输出包含多行时,PowerShell返回字符串的 array ,每个字符串代表一个输出行。