首页 > 解决方案 > 从列表 Powershell 中获取距今天最近的日期

问题描述

对不起,一个可能很简单的问题,但老实说,我无法形成正确的解决方案。

脚本会生成一个列表,其中包含时间和 AD 组名称的信息,格式如下:

+----------------+---------------------+
|  ADGroupName   |       StartTime     |
+----------------+---------------------+
| AD-group-name1 |  15.7.2020 00:00:00 |
| AD-group-name2 |  18.7.2020 00:00:00 |
| AD-group-name3 |  21.7.2020 00:00:00 |
| AD-group-name4 |  22.7.2020 00:00:00 |
| AD-group-name5 |  23.7.2020 00:00:00 |
| AD-group-name6 |  24.7.2020 00:00:00 |
| AD-group-name7 |  25.7.2020 00:00:00 |
| AD-group-name8 |  26.7.2020 00:00:00 |
| AD-group-name9 |  30.7.2020 00:00:00 |
+----------------+---------------------+

下一个问题是:如何显示列表中的一行,其中仅包括最接近今天日期的下一个日期?

谢谢!

更新:原始代码如下所示

cd 'E:\Program Files\Microsoft Configuration Manager\AdminConsole\bin'
Import-Module .\ConfigurationManager.psd1
cd T:\
$CollectionIDs = "id1" , "id2"
$date=[datetime]::Today.ToString('MM')
$month= $date.substring(1) 
$Outfile = "C:\temp\outfile.txt"
if (Test-Path $Outfile) {Clear-Content $Outfile}
foreach ($id in $CollectionIDs) { 
if ($id -eq "id1") { 
Get-CMMaintenanceWindow -CollectionId "$id" | Select-Object @{Name='ADGroupName';Expression={'\AD-group-name1'}}, StartTime | Sort-Object StartTime -Descending | ft -AutoSize | out-string | Add-Content $Outfile
}
elseif ($id -eq "id2") {
Get-CMMaintenanceWindow -CollectionId "$id" | Select-Object @{Name='ADGroupName';Expression={'\AD-group-name2'}}, StartTime | Sort-Object StartTime -Descending | ft -AutoSize | out-string | Add-Content $Outfile
}
}
$result = Select-String -Path $Outfile -Pattern ".$month." -SimpleMatch
Remove-Item $Outfile
$result -creplace '(?s)^.*\\', '

标签: powershell

解决方案


就像 Mathas 在评论中所说的那样,现在仍然很明显 StarTime 是字符串还是日期时间。所以我用 StartTime 作为字符串创建了对象数组并添加了解析。.

    $data=@(
        @{ADGroupName='AD-group-name1';StartTime='15.7.2020 00:00:00'},@{ADGroupName='AD-group-name2';StartTime='18.7.2020 00:00:00'},@{ADGroupName='AD-group-name3';StartTime='21.7.2020 00:00:00'},@{ADGroupName='AD-group-name4';StartTime='22.7.2020 00:00:00'},@{ADGroupName='AD-group-name5';StartTime='23.7.2020 00:00:00'},@{ADGroupName='AD-group-name6';StartTime='24.7.2020 00:00:00'},@{ADGroupName='AD-group-name7';StartTime='25.7.2020 00:00:00'},@{ADGroupName='AD-group-name8';StartTime='26.7.2020 00:00:00'},@{ADGroupName='AD-group-name9';StartTime='30.7.2020 00:00:00'}
    ) | foreach{[pscustomobject]$_}
    
    # fixed date just to create working example
    $today =  get-date -Year 2020 -Month 7 -Day 24

    # parse datetime strings, filter by today, sort, select first result
    $data | 
      select adgroupname,@{n='StartTimeParsed';e={[datetime]::ParseExact($_.StartTime,'dd.M.yyyy HH:mm:ss',[System.Globalization.CultureInfo]::InvariantCulture)}} | 
      where StartTimeParsed -gt $today | sort StartTimeParsed | select -First 1

推荐阅读