我有一个包含日期的字符串,我想将过去15天的所有日期与字符串中的日期进行比较。
我将所有15天的日期都存储在数组中,并与字符串中的日期进行比较。
#last 15 days date.
$Q = @()
$Q = for ($i=15; $i -gt 1; $i--) {
$date=Get-Date -DisplayHint Date #-Format "dd MMM yyyy"
$final=$date.AddDays(-$i)
$final.tostring("dd MMM yyyy")
}
# $array.'Description' have string like this "Enabled AD ID as per Call id: 509112 29 Oct 2019"
#comparing
if($array.'Description' -notcontains $Q){
Write-host ("true")
}else
{
write-host ("false")
}
我想比较结果。
答案 0 :(得分:2)
您可以拆分$array.'Description'
,然后加入最后三个元素,然后将其与$ Q进行比较。
($($array.'Description').Split(" ") | Select-Object -Last 3) -join " "
比较结果如下:
if ((($($array.'Description').Split(" ") | Select-Object -Last 3) -join " ") -notcontains $Q){
Write-host ("true")
}else
{
write-host ("false")
}
答案 1 :(得分:1)
我认为您应该始终将日期与日期进行比较,而不是将它们的字符串表示形式进行比较,除非它位于Sortable format中。
下面的代码从Description属性获取日期字符串,并将其转换为本地DateTime对象以与之进行比较:
$refDate = (Get-Date).AddDays(-15).Date # midnight 15 days ago
$array | ForEach-Object {
# parse a date object from the Description string
$dateString = ([regex]'(\d{1,2} \w{3} \d{4})$').Match($_.Description).Groups[1].Value
$date = [datetime]::ParseExact($dateString, 'd MMM yyyy', [cultureinfo]"en-US")
# make it a Local date
$date = [datetime]::SpecifyKind($date, 'Local')
if ($date -gt $refDate) {
# the description date is inside the last 15 days
Write-Host "True"
}
else { Write-Host "False" }
}
根据Esperanto57的注释,如果Description字符串不包含要解析的日期,则下面使用try{..} catch{..}
块来解决:
$array | ForEach-Object {
try {
# parse a date object from the Description string
$dateString = ([regex]'(\d{1,2} \w{3} \d{4})$').Match($_.Description).Groups[1].Value
$date = [datetime]::ParseExact($dateString, 'd MMM yyyy', [cultureinfo]"en-US")
# make it a Local date
$date = [datetime]::SpecifyKind($date, 'Local')
if ($date -gt $refDate) {
# the description date is inside the last 15 days
Write-Host "True"
}
else { Write-Host "False" }
}
catch {
Write-Host "False. (The Description attribute does not contain a date.)"
}
}