代码之家  ›  专栏  ›  技术社区  ›  Chabango

使用PowerShell筛选日期

  •  1
  • Chabango  · 技术社区  · 6 月前

    我意识到这应该是一项简单的任务,但我没有看到我期望看到的结果。 我正在导入一个CSV文件,并试图过滤掉已经过去的日期,只保留等于今天或将来的日期。

    举个简单的例子,我有一个csv文件,其中包含以下内容:

    enter image description here

    如果我运行以下代码,我没有看到预期的结果;今天或将来相等的日期:

     $Today = Get-date
    
    $data = import-csv C:\temp\ReleaseRequest2.csv
    $data | where {$_.expires -ge $Today} | select expires
    

    当我运行上述命令时,我收到以下结果:

    enter image description here

    目标是只返回等于今天或未来的日期。 在尝试过滤日期之前,我需要对日期进行格式化吗? 我知道这是一个简单的解决方案,但我正在用头撞墙,试图弄清楚。

    提前感谢。

    1 回复  |  直到 6 月前
        1
  •  1
  •   Santiago Squarzon    6 月前

    将日期转换为 datetime 在比较它们之前,您可以看到为什么您的代码在这个简单的测试中失败:

    $today = Get-Date
    '11/26/2024 8:55' -ge $today            # true
    [datetime] '11/26/2024 8:55' -ge $today # false
    

    因此,在您的过滤条件下,如果您将演员阵容添加到 [datetime] 应该解决这个问题:

    $today = Get-Date
    $data = Import-Csv C:\temp\ReleaseRequest2.csv
    $data | Where-Object { [datetime] $_.Expires -ge $Today }
    

    使用 Get-Date 解析它们也应该起作用:

    $data | Where-Object { (Get-Date $_.Expires) -ge $Today }
    

    如果上述选项无法将字符串转换为 日期时间 对象,您可以使用 datetime.ParseExact 使用日期的格式字符串,例如:

    [datetime]::ParseExact(
        '1/28/2025 8:55', 'M/d/yyyy H:mm', [cultureinfo]::InvariantCulture)
    
        2
  •  1
  •   js2010    6 月前

    你可以这样做,比较类型将是[datetime],由左侧的类型决定:

    $Today = Get-date
    
    $data = import-csv C:\temp\ReleaseRequest2.csv
    $data | where {$Today -lt $_.expires} | select expires