PowerShell查询返回异常:获取最早修改文件夹问题求助
问题排查与修复方案
嘿,我来帮你搞定这个头疼的问题——你的PowerShell命令里藏着两个关键问题,才导致结果不符合预期还每次返回不一样的内容,咱们一步步拆解修复:
1. 排序用错了属性名(这是核心问题!)
你在Sort-Object里写的$_.datemodified其实是错的!PowerShell里表示文件夹最后修改时间的正确属性是**LastWriteTime**。当你引用一个不存在的属性时,PowerShell会把所有对象的排序值都当成null,这时候排序就完全是随机的——这就是为啥每次查结果都不一样的原因!
2. 没明确只找文件夹(潜在坑)
Get-ChildItem默认会把指定路径下的文件和文件夹都列出来,如果你的目录里刚好有符合命名格式的文件,它们也会被混进来筛选。建议加上-Directory参数,明确只拿子目录,这样更精准。
3. 正则可以再精准点(可选,看你的需求)
你提到的非预期文件夹比如4-29-1522845689658894,其实是符合你写的[0-9]+-[0-9]+-[0-9]+正则的,因为这个正则只要是“数字段-数字段-数字段”就匹配,范围太宽。如果你的目标文件夹有更严格的命名规则(比如最后一段是固定13-15位长数字),可以把正则改成这样:
- 要是前两段是1-2位数字,最后一段13-15位:
^\d{1,2}-\d{1,2}-\d{13,15}$ - 要是前两段位数随意,最后一段至少13位:
^\d+-\d+-\d{13,}$
(加^和$是为了确保整个文件夹名称都符合格式,不会匹配那些名称里包含该格式的其他文件夹)
修复后的完整命令
$folder = Get-ChildItem -Path 'E:\moved-documents\' -Directory | Where-Object { $_.Name -match '^\d+-\d+-\d+$' } | Sort-Object LastWriteTime | Select-Object -First 1
为啥这么改:
-Directory:只抓子目录,排除无关文件Sort-Object LastWriteTime:用正确的修改时间属性排序,默认是升序,最早修改的会排在最前面- 正则加了
^和$:确保整个文件夹名完全匹配格式,不会漏判或误判
先验证再用更稳妥
你可以先跑下面这条命令,看看所有符合条件的文件夹和它们的修改时间,确认排序是不是正确的:
Get-ChildItem -Path 'E:\moved-documents\' -Directory | Where-Object { $_.Name -match '^\d+-\d+-\d+$' } | Select-Object Name, LastWriteTime | Sort-Object LastWriteTime
内容的提问来源于stack exchange,提问作者Razort4x
相关产品推荐
相关产品推荐

