我在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
}
}
答案 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=
部分),因此您必须显式地解析字符串,分别为AdminOfThings和Theo建议:
$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 ,每个字符串代表一个输出行。