You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell按日期获取文件问题:如何获取创建时间匹配的目标文件?

解决PowerShell中过滤文件后无法访问文件对象的问题

你的问题出在管道结构的语法错误上——你把ForEach-Object嵌套在了Where-Object的脚本块内部,导致管道流被打乱,$_在内部的ForEach-Object里变成了-match返回的布尔值,而不是你想要的文件对象。

错误原因拆解

看你原来的代码:

Get-ChildItem $myDIRECTORY | Where-Object { $_.CreationTime.Date.ToString() -match $myCreationTime | ForEach-Object{ Write-Host $_.ToString() } }

这里的核心问题是:Where-Object的脚本块只需要返回一个布尔值,用来决定是否保留当前的文件对象。但你在脚本块里额外加了一个管道到ForEach-Object,此时ForEach-Object接收的是-match操作返回的布尔值(True/False),而不是原始的文件对象,所以你输出的只是匹配结果,而非文件信息。

正确的实现方式

你需要调整管道顺序:先用Where-Object过滤出符合条件的文件,再用ForEach-Object处理这些文件对象。

方法1:标准管道过滤+处理

Get-ChildItem $myDIRECTORY | 
  Where-Object { $_.CreationTime.Date.ToString() -eq $myCreationTime } | 
  ForEach-Object { 
    # 这里的$_就是符合条件的文件对象,可以访问任意属性
    Write-Host "匹配的文件名:$($_.BaseName)"
    Write-Host "文件完整路径:$($_.FullName)"
  }

这里我把-match换成了-eq,因为日期字符串的精确匹配用相等判断更稳妥,避免正则匹配带来的意外(比如日期中包含.或*这类正则特殊字符时会出错)。如果你的$myCreationTime确实需要正则匹配,再换回-match即可。

方法2:在ForEach-Object内部直接判断

如果你不想拆分管道,也可以直接在ForEach-Object里做条件判断:

Get-ChildItem $myDIRECTORY | ForEach-Object {
  if ($_.CreationTime.Date.ToString() -eq $myCreationTime) {
    Write-Host "找到目标文件:$($_.BaseName)"
  }
}

额外提示

如果你只是想获取符合条件的文件集合,而不是直接打印,可以把结果存到变量里,后续按需操作:

$targetFiles = Get-ChildItem $myDIRECTORY | Where-Object { $_.CreationTime.Date.ToString() -eq $myCreationTime }
# 遍历文件集合
$targetFiles | ForEach-Object { Write-Host $_.BaseName }
# 直接获取所有文件名
$targetFiles.BaseName

内容的提问来源于stack exchange,提问作者Fabio Florey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:47:27