问题描述
所以,我有一个网站图片目录。有.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 }