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
相关产品推荐
相关产品推荐

