如何在PowerShell中获取日期值最大的备份文件?
获取日期值最大的备份文件(PowerShell)
问题场景
现有备份文件列表:
BACKUP-20220114.BAK BACKUP-20220118.BAK BACKUP-20220120.BAK
尝试通过以下命令获取日期值最大的文件时触发错误:
ls BACKUP* | select-object -Property Name | Measure-Object -Maximum
错误提示:
Measure-Object : Cannot compare "@{Name=BACKUP-20221028.bak}" because it is not IComparable.
错误原因
你用Select-Object -Property Name输出的是包含Name属性的自定义对象,不是纯字符串类型,Measure-Object无法对这类对象执行最大值比较操作,所以报错。不需要特意让字符串具备IComparable特性,换下面的处理方式即可解决。
解决方法
方法1:直接基于文件名字符串排序(简单高效)
文件名的日期部分是yyyyMMdd格式,字符串排序结果和日期大小顺序一致,直接排序后取第一个(降序):
# 获取最新备份文件的名称 (Get-ChildItem BACKUP* | Sort-Object Name -Descending)[0].Name # 如果需要获取完整的文件对象(比如后续要复制/删除) Get-ChildItem BACKUP* | Sort-Object Name -Descending | Select-Object -First 1
或者用Measure-Object处理纯字符串:
(Get-ChildItem BACKUP*).Name | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
方法2:提取日期转为日期类型比较(更严谨)
如果担心未来文件名前缀或格式变化,可从文件名中提取日期转为DateTime类型再比较,结果更可靠:
Get-ChildItem BACKUP* | ForEach-Object { # 从文件名中提取日期段:拆分"-"和".",取中间的数字部分 $dateStr = $_.Name -replace 'BACKUP-(\d+)\.BAK', '$1' $date = [DateTime]::ParseExact($dateStr, 'yyyyMMdd', $null) # 输出包含文件和日期的对象 [PSCustomObject]@{ File = $_ BackupDate = $date } } | Sort-Object BackupDate -Descending | Select-Object -First 1 -ExpandProperty File
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

