获取具有特定日期范围的文件列表

时间:2019-04-24 03:32:28

标签: powershell

Windows 10 x64 1709
PowerShell 5.1

我有一个PowerShell脚本,该脚本以递归方式列出目录(和子目录)中的所有文件,并将列表输出到文本文件。 我现在想在特定日期范围内使用LastWriteTime获取文件。 我在其他问题/站点中找到了以下示例,该示例应该可以工作:

(Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse).FullName | Where-Object {
    $_.LastWriteTime -ge '01/01/2019 00:00:00' -and
    $_.LastWriteTime -le '22/04/2019 00:00:00'
} > 'C:\path\to\files\filelist.txt'

(日期在我的系统中为dd / MM / YYYY,但我也尝试了其他格式,以防万一)

起初,我认为这是与日期/时间格式有关的问题,我花了几个小时来敲打头,尝试进行各种转换。 我还尝试使用Where代替Where-Object,同样的问题。

我终于想到了尝试更简单的方法:分别运行每个条件。瞧瞧,这就是交易。

如果我运行-le

(Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse).FullName |
    where LastWriteTime -le '22/04/2018 01:00:00'

我得到文件列表。

如果我运行-ge

(Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse).FullName |
    where LastWriteTime -ge '01/01/2019 00:00:00'

列表为空(也没有错误)。

但是,以下方法确实有效:

(Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse).FullName |
    where LastWriteTime -ge $Today

我正在寻找有关-ge参数的文档;用小写/大写尝试过...不行。

我缺少明显的东西吗? -ge坏了吗?

PS:我尝试将LastWriteTime更改为CreationTime,但问题仍然存在(不是很重要,只是提及)。

1 个答案:

答案 0 :(得分:2)

首先,您没有沿管道传递文件对象,而是通过使用.FullName属性传递字符串。这些文件名只是文件名,它们没有LastWriteTime属性。更改脚本以仅传递文件对象。

Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse |

第二,将日期比较转换为datetime对象。否则,您将比较DateTime对象从LastWriteTime到System.String。 Powershell会尝试进行转换,但是由于语言环境格式的差异,有时会出错。例如: 对我有Get-Date '22/04/2019 01:00:00'个错误。我将使用DateTime.ParseExact方法解析日期字符串。您可能需要更改您所在位置的CultureInfo。

$upperBound = [datetime]::ParseExact('22/04/2019 01:00:00',
                                     'dd/MM/yyyy hh:mm:ss',
                                     [Cultureinfo]::InvariantCulture)
$lowerBound = [datetime]::ParseExact('01/01/2019 01:00:00',
                                     'dd/MM/yyyy hh:mm:ss',
                                      [Cultureinfo]::InvariantCulture)

Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse | Where-Object {
    $_.LastWriteTime -ge $lowerBound -and $_.LastWriteTime -le $upperBound
}  | Select-Object -ExpandProperty FullName