如何用PowerShell筛选名称含yyyy-MM-dd格式日期的CSV文件?
解决PowerShell筛选含yyyy-MM-dd格式日期的CSV文件问题
原代码无效的原因
-Filter参数的局限:你使用的*yyyy-MM-dd.csv是文件系统原生通配符,它会字面匹配文件名中包含"yyyy-MM-dd"这串固定字符的文件,而非符合日期格式的文件,自然找不到2022-01-15.csv这类实际日期命名的文件。Where-Object的可能错误:如果之前用Where-Object没成功,大概率是正则表达式写法有误,没正确匹配日期格式的字符规则。
正确实现方法
基础版:匹配日期格式的文件名
用Where-Object结合正则表达式,精准匹配文件名中的yyyy-MM-dd格式:
# 情况1:仅匹配纯日期命名的CSV(如2022-01-15.csv) Get-ChildItem -Path "C:\csv files" -Filter "*.csv" | Where-Object { $_.Name -match '^\d{4}-\d{2}-\d{2}\.csv$' } # 情况2:匹配文件名任意位置包含日期的CSV(如sales_2022-01-15.csv) Get-ChildItem -Path "C:\csv files" -Filter "*.csv" | Where-Object { $_.Name -match '\d{4}-\d{2}-\d{2}' }
正则规则解释:
\d{4}:匹配4位年份数字-\d{2}-:匹配短横线分隔的两位月份、日期数字^\和$:限定匹配整个文件名(仅纯日期命名时需要)\.csv$:转义点号,精准匹配CSV后缀
进阶版:验证日期有效性
如果需要排除2022-13-32这类格式正确但无效的日期,可以在筛选中增加日期合法性验证:
Get-ChildItem -Path "C:\csv files" -Filter "*.csv" | Where-Object { if ($_.BaseName -match '^\d{4}-\d{2}-\d{2}$') { [DateTime]::TryParseExact($matches[0], 'yyyy-MM-dd', $null, [System.Globalization.DateTimeStyles]::None, [ref]$null) } }
补充提示
-Filter仅适合简单的前缀/后缀匹配(如*.csv),复杂格式筛选优先用Where-Object+正则表达式,功能更灵活可靠。
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

