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
,但问题仍然存在(不是很重要,只是提及)。
答案 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