有没有一种方法可以删除文件夹中的所有图像,这是通过Windows批处理小于一定的宽度?

h7wcgrx3  于 2023-11-21  发布在  Windows
关注(0)|答案(2)|浏览(199)

我想写一个简单的程序来提取的windows聚光灯图像从系统目录中,他们住在一个文件夹,我可以更容易地得到他们。到目前为止,我有这个:

@ECHO OFF
if not exist "%homedrive%%homepath%\Downloads\Spotlight" mkdir %homedrive%%homepath%\Downloads\Spotlight
xcopy /s %homedrive%%homepath%\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets\ %homedrive%%homepath%\Downloads\Spotlight
ren %homedrive%%homepath%\Downloads\Spotlight\* *.jpg

字符串
它成功地将spotlight目录中的内容复制到一个新文件夹中,然后重命名所有文件使其成为JPG。然而,也有一些杂项图标,以及“肖像模式”spotlight图像。我想通过检查输出文件夹中的每个.jpg来删除它们,看看它的宽度是否小于1920像素,如果是,则删除图像。
我去AI试图解决我的问题,但失败了:

set "SpotlightFolder=%USERPROFILE%\Downloads\Spotlight"
:: Iterate over all .jpg files and delete those with width smaller than 1920 pixels
for %%F in ("%SpotlightFolder%\*.jpg") do (
    for /f %%W in ('powershell -command "& {(Get-ImageDimensions '%%~F').Width}"') do set "Width=%%W"
    if !Width! lss 1920 (
        echo Deleting: %%~nxF
        del "%%F"
    ) else (
        echo Keeping: %%~nxF
    )
)

:: PowerShell script to get image dimensions
<#
function Get-ImageDimensions {
    param([string]$filePath)
    $image = [System.Drawing.Image]::FromFile($filePath)
    $width = $image.Width
    $image.Dispose()
    $width
}
#>


这将返回一个模糊的“命令语法不正确”错误,并删除文件夹中的所有图像,无论尺寸如何。

hof1towb

hof1towb1#

下面是一个.bat文件脚本,它将删除宽度小于1000的.jpeg文件。根据您的喜好编辑PICESTAL和MIN_WIDTH值。当您对删除正确的文件感到满意时,从Remove-Item命令中删除-WhatIf

SET "PICDIR=%USERPROFILE%\Pictures"
SET "MIN_WIDTH=1000"
pwsh -NoLogo -NoProfile -Command ^
    "$PicDir = '"%PICDIR%"';" ^
    "Get-ChildItem -File -Path $PicDir -Filter '*.jpeg' |" ^
        "ForEach-Object {" ^
            "$Image = [System.Drawing.Image]::FromFile($_.FullName);" ^
            "if ($Image.Width -lt %MIN_WIDTH%) { $_ };" ^
            "$Image.Dispose();" ^
        "} |" ^
        "Remove-Item -WhatIf;"

字符串

dphi5xsq

dphi5xsq2#

使用System.Drawing.Image可能不是很有效,因为它实际上解码和加载了整个图像。元数据可以直接使用ShellCOM objectFolder.GetDetailsOf() method访问,所以获取图像的宽度非常便宜。下面是一个简单的PowerShell脚本来完成你想要的任务:

$minWidth = 1920
$SpotlightFolder = "${env:USERPROFILE}\Downloads\Spotlight"

$widthColumnNum = 176 # or 165 or some other value, see below for details
$shell = New-Object -COMObject Shell.Application
$shellfolder = $shell.Namespace($SpotlightFolder)

Get-ChildItem -Filter *.jpg $SpotlightFolder | Where-Object {
    $shellfile = $shellfolder.ParseName($_.Name)
    $w = $shellfolder.GetDetailsOf($shellfile, $widthColumnNum)
    [int]([regex]::Match($w, "\d+").Value) -lt $minWidth
} | Remove-Item -WhatIf

字符串
基本上,这会列出指定路径中的所有 *.jpg文件,过滤Width小于$minWidth的文件,将其传递给Remove-Item。删除-WhatIf选项以进行实际删除
列号165是从here中提取的魔术,或基于this的176。您可以在What options are available for Shell32.Folder.GetDetailsOf(..,..)?中运行PowerShell脚本以查找系统上的实际值,以防它不同:

$objFolder = (New-Object -ComObject Shell.Application).Namespace('c:\')
for ($columnNumber = 0; $columnNumber -lt 500; ++$columnNumber) 
{ 
    $columnName = $objFolder.GetDetailsOf($objFolder.Items, $columnNumber) 
    if ($columnName)
    {
        Write-Output "$(([string]$columnNumber).PadLeft(3)) $columnName"
    }
}


我已经在我的电脑上测试过了,它工作正常,图像宽度是预期的176字段。当然,你也可以自动化的方法来获得这个神奇的数字,但我在这里保持简单
有关元数据阅读的详细信息,请检查

因为它使用COM对象,所以可以从任何支持COM对象的语言调用它,例如JS、VBS或hybrid VBS/hybrid JS

相关问题