从 Powershell 中的 CSV 导入数据提供 CSV 中的英国日期少于 7 天

Importing Data From CSV in Powershell Providing UK Date in CSV is Less Than 7 Days Away

所以我有一个包含 5 个标题的 CSV 文件:姓名、collection日期、地点、设备备注、经理。

现在我的collection日期都是英国格式,所以DD/MM/YYYY。我只想从 CSV 中导入 collection 日期不超过 7 天的数据。 所以今天是 17/08,因此我只想从 17/08 到 24/08 之间的 CSV 中提取数据。

尽管 Powershell 可以按英国格式处理日期时间 objects(如果您告诉它的话),但我似乎无法再操纵日期以增加 7 天。

这是我当前的代码:

$today = Get-Date
$thisWeek = $today.AddDays(7)
$thisWeekString = $thisWeek.ToString()
$dateParts = $thisweekString -split " "
$weekFinal = $dateParts[0]

$import = Import-Csv @("\location\EmailCSV.csv") | Where-Object {$_.collectionDate -lt $weekFinal}

Powershell 正确地将 7 天添加到日期时间以使其成为 24/08,然后在将其转换为字符串并从中删除时间时,它正确地将变量设置为 24/08/2018。但是当我在 Import cmdlet 中比较它们时,它只是 returns CSV 中的所有数据,而不是日期小于 24/08。

我也知道 Powershell 可以比较这些,因为如果我创建一个单独的变量 $otherDate,其中包含 24/08/2018,然后创建一个 if 语句来检查 $weekFinal 是否大于或小于 $otherDate,它在 true 时正确运行语句。

我尝试在 Import-Csv cmdlet 中同时使用 Where 和 Where-Object,但两者都返回了相同的结果。

如何让 Powershell 正确比较 $_.collectionDate 和 $weekFinal 以过滤从 csv 导入的数据?

尝试将比较中的字符串转换为 [datetime]。当使用样本数据集时,我能够得到预期的结果。

$import = Import-Csv @("\location\EmailCSV.csv") | Where-Object {[datetime]$_.collectionDate -lt [datetime]$weekFinal}

使用 [datetime] 个实例执行 所有 计算和比较是 最容易的 - 避免 string 操作(将日期的字符串表示形式转换为 [datetime] 实例除外)。

首先,将今天的日期和从现在起 1 周后的日期表示为 [datetime] 没有时间组件的实例:

$today = (Get-Date).Date  # Today's date, without a time component (midnight)
$oneWeekFromToday = $today.AddDays(7)

然后使用 [datetime]::Parse() 将感兴趣的始终为字符串类型的 CSV 列值转换为 [datetime] 实例,以便您可以执行正确的日期比较。

$import = Import-Csv \location\EmailCSV.csv | Where-Object { 
  $thisDate = [datetime]::Parse($_.collectionDate)
  # Process this row if its date falls between today and 1 week from now, inclusively.
  $thisDate -ge $today -and $thisDate -le $oneWeekFromToday
}

重要使用[datetime]::Parse('...'),而不是[datetime] '...' cast,因为只有[datetime]::Parse()尊重当前文化的日期和时间格式;按照设计,PowerShell 的转换和字符串插值始终使用我的 invariant culture, irrespective of the current culture - for more information, see this answer