如何根据重复的 .jpeg 文件具有相同的 .BaseName在过去 24 小时内是否已更改删除目录中的所有 .webp 文件?

问题描述

所以,我有一个网站图片目录。有.jpeg扩展名和.webp扩展名都相同的图片。我想编写一个 PowerShell 脚本来查找过去 24 小时内更改的所有现有 .jpeg 文件,然后找到相应的 .webp 文件删除 .webp 文件

我已经尝试过获取所有可以删除.webp 文件,但它似乎不起作用:

$images = Get-ChildItem -Path $dir\*.jpg,$dir\*.webp | 
group-object { $_.BaseName } |
    Where-Object {($_.CreationTime -gt (Get-Date).AddDays(-1)) -or ($_.Group.Extension -notcontains '.jpg')} | 
        ForEach-Object Group

解决方法

我认为这更容易:

获取截至昨天最后修改的 jpg 文件的基名列表,接下来获取同一目录中具有 .webp 扩展名的文件列表,这些文件的 BaseName 与 jpg 基名之一匹配,然后删除这些文件。

$dir     = 'D:\Test'
$refdate = (Get-Date).AddDays(-1).Date
$jpegs   = (Get-ChildItem -Path $dir -Filter '*.jpg' -File | Where-Object { $_.LastWriteTime -gt $refdate }).BaseName
Get-ChildItem -Path $dir -Filter '*.webp' -File | Where-Object { $jpegs -contains $_.BaseName } | Remove-Item -WhatIf

如果您对正确的文件被删除感到满意,请移除安全 -WhatIf 开关并再次运行。

,

Theo's helpful answer 向您展示了另一种方法;如果您想坚持使用 Group-Object 方法:

$webpFilesToDelete = 
  Get-ChildItem -Path $dir\*.jpg,$dir\*.webp | 
    Group-Object BaseName | Where-Object Count -eq 2 |
      ForEach-Object {
        # Test the creation date of the *.jpg file.
        if ($_.Group[0].CreationTime -gt (Get-Date).AddDays(-1)) {
          $_.Group[1] # Output the corresponding *.webp file
        }
      }
  • 请注意,在您自己的尝试中,使用了 .CreationTime,但请注意,文件是否有机会在创建后 再次更新,这就是您的时间戳关心,你应该使用.LastWriteTime

  • 该命令依赖于 Group-Object 根据排序条件对其创建的组的元素进行排序的事实,在本例中,这是由于按 string 属性分组- 表示词法排序,其中 .jpg 文件列在 .webp 文件之前。

  • 因此,对于具有 2 个元素 (Where-Object Count -eq 2) 的组,这意味着对于给定的基本名称同时存在 .jpg.webp 文件,{{1} } 指的是 $_.Group[0] 文件,而 .jpg 指的是 $_.Group[1] 文件。


至于你尝试了什么

  • .webp 产生 $_.CreationTime,因为您的命令中的 $null 指的是手头的 group-information 对象({{3 }}),作为$_的输出,并且该类型没有这样的属性。

  • 此外,由于您使用的是 Group-Object,因此您只需过滤组,以便通过过滤器测试的任何组按原样通过,并且Where-Object 然后输出组中的两个文件。

,

感谢您的有用回答和澄清!我最初认为我需要 .LastWriteTime,但我需要 .CreationTime。这满足了我的需要。结果如下:

$refdate = (Get-Date).AddDays(-1).Date
$jpegs   = (Get-ChildItem -Path $dir -Filter '*.jpg' -File | Where-Object { $_.CreationTime -gt $refdate }).BaseName
$webp = Get-ChildItem -Path $dir -Filter '*.webp' -File | Where-Object { $jpegs -contains $_.BaseName }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...