首页 > 解决方案 > 使用多个字符串和日期条件定位文件

问题描述

我正在尝试使用如下代码来查找具有特定字符串、扩展名和 lastwritetime 的文件:

get-childitem C:\users\nila9\Downloads -filter *.mkv -recurse 
    | where-object { $_.Name -match ("*bluray*" -and "*1080*") -and $_.lastwritetime -match "11/20/2020" }

该代码旨在首先过滤下载文件夹中具有扩展名的所有文件,*.mkv然后进一步筛选包含字符串“bluray”和“1080”并在指定日期之后修改的文件名。

虽然此代码不会返回任何错误,但它不会执行并将控制权释放到提示符处。

有什么地方我弄错了吗?

谢谢

标签: stringpowershellfilter

解决方案


正如Lee_Dailey指出的那样,-match使用正则表达式并且需要不同的语法。您的代码需要一个不同的运算符来处理通配符 ( *),为此,有-like

此外,您不应该尝试将 DateTime 对象与字符串进行比较,因此-match也无济于事。

如果文件名需要 BOTH bluray AND 1080,您可以将代码更改为

$refDate = (Get-Date -Year 2020 -Month 11 -Day 20).Date  # set time part to all 0 (--> midnight)
Get-ChildItem -Path 'C:\users\nila9\Downloads' -Filter '*.mkv' -Recurse | 
    Where-Object { $_.Name -like "*bluray*" -and $_.Name -like "*1080*" -and $_.LastWriteTime -ge $refDate }

但是,如果文件需要在其名称中包含bluray OR , 则可以在该部分使用:1080-match

$refDate = (Get-Date -Year 2020 -Month 11 -Day 20).Date  # set time part to all 0 (--> midnight)
Get-ChildItem -Path 'C:\users\nila9\Downloads' -Filter '*.mkv' -Recurse | 
    Where-Object { $_.Name -match "bluray|1080" -and $_.LastWriteTime -ge $refDate }

正则表达式中的管道符号|是 OR 运算符


推荐阅读