在 Windows 资源管理器搜索中比较框架宽度和框架高度

在 Windows 资源管理器搜索中比较框架宽度和框架高度

我正在尝试对一大组视频 (1700) 进行排序。我想将宽度大于高度的视频与高度大于宽度的视频区分开来。

我在网上找到了下面的术语,您可以在其中搜索特定宽度的视频:

framewidth: <=640

我尝试改变这一点以使其对我有利,但提出了以下解决方案,但没有效果:

framewidth: < frameheight

有什么想法我可以使用“framewidth”和“frameheight”值对这些视频进行排序吗?

答案1

Windows 10 专业版 64 位

如何组织你的视频:

Explorer 不会按尺寸对视频进行排序。使用批处理文件进行排序,获取所有视频的宽度和高度,如果宽度大于高度,则移动到%userprofile%\Desktop\1如果多个目录中的视频更改dir /bdir /b /s制作一个包含名称、宽度、高度、持续时间、比特率和采样率的文本文件,并按名称、日期、大小排序。

批处理文件:使用 md、cmd、for、dir、ffprobe、set、if 和 move 进行排序:

必须在具有管理权限的窗口中运行。
将扩展添加到dir /b *.mp4 *.mkv
用于测试清除目录 1 的桌面
如果路径中有空格则有效。
下载最新的适用于 Windows 64 位的 ffprobe、ffmpeg 和 ffplay,可从 ffmpeg.zeranoe.com
下载测试文件(5MB)来自 Google Drive
如何编写批处理文件

命令:

cmd /V
if not exist "%userprofile%\Desktop\1" md "%userprofile%\Desktop\1"
for /F "tokens=*" %g in ('dir /b *.mp4 *.mkv') do (
for /F %h in ('ffprobe.exe -v error -show_entries stream^=width -of default^=noprint_wrappers^=1:nokey^=1 "%g" 2^>^&1') do set zwidth=%h
for /F %h in ('ffprobe.exe -v error -show_entries stream^=height -of default^=noprint_wrappers^=1:nokey^=1 "%g" 2^>^&1') do set zheight=%h
if !zwidth! gtr !zheight! move /y "%g" "%userprofile%\Desktop\1"
)
rem 

脚本:

setlocal enabledelayedexpansion
if not exist "%userprofile%\Desktop\1" md "%userprofile%\Desktop\1"
for /F "tokens=*" %%g in ('dir /b *.mp4 *.mkv') do (
for /F %%h in ('ffprobe.exe -v error -show_entries stream^=width -of default^=noprint_wrappers^=1:nokey^=1 "%%g" 2^>^&1') do set zwidth=%%h
for /F %%h in ('ffprobe.exe -v error -show_entries stream^=height -of default^=noprint_wrappers^=1:nokey^=1 "%%g" 2^>^&1') do set zheight=%%h
if !zwidth! gtr !zheight! move /y "%%g" "%userprofile%\Desktop\1"
)
rem 

测试文件:

input270x480.mp4
input480x270 whitespace.mp4
input480x270.mp4
input270x480.mkv
input480x270 whitespace.mkv
input480x270.mkv

结果:

input480x270 whitespace.mkv
input480x270 whitespace.mp4
input480x270.mkv
input480x270.mp4

制作一个包含名称、宽度、高度、持续时间、比特率、采样率的文本文件,并按名称、日期、大小排序:

命令:

(
echo Sort by name
echo %date%
echo%time%
echo.)> sortbyname.txt
for /F "tokens=*" %g in ('dir /b *.mp4 *.mkv') do (
echo %g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%g"    
echo.
)>> sortbyname.txt

(
echo Sort new to old 
echo %date% 
echo%time% 
echo.)> sortNewToOld.txt 
for /F "tokens=*" %g in ('dir /b /o-d *.mp4 *.mkv') do (
echo %g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%g"    
echo.
)>> sortNewToOld.txt

(
echo Sort large to small 
echo %date% 
echo%time% 
echo.)> sortLargeToSmall.txt
for /F "tokens=*" %g in ('dir /b /o-s *.mp4 *.mkv') do (
echo %g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%g"    
echo.
)>> sortLargeToSmall.txt
rem 

脚本:

(
echo Sort by name
echo %date%
echo%time%
echo.)> sortbyname.txt
for /F "tokens=*" %%g in ('dir /b /a-d *.mp4 *.mkv') do (
echo %%g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%%g"    
echo.
)>> sortbyname.txt

(
echo Sort new to old 
echo %date% 
echo%time% 
echo.)> sortNewToOld.txt 
for /F "tokens=*" %%g in ('dir /b /o-d *.mp4 *.mkv') do (
echo %%g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%%g"    
echo.
)>> sortNewToOld.txt

(
echo Sort large to small 
echo %date% 
echo%time% 
echo.)> sortLargeToSmall.txt
for /F "tokens=*" %%g in ('dir /b /o-s *.mp4 *.mkv') do (
echo %%g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%%g"    
echo.
)>> sortLargeToSmall.txt
rem 

答案2

Windows 资源管理器不是执行此类操作的合适工具。PowerShell 更合适。

您可以使用以下 PowerShell 脚本将所有宽度小于高度的图像移动到另一个文件夹:

$image = New-Object -ComObject Wia.ImageFile
foreach ($item in Get-ChildItem "C:\source\folder" | Where-Object Extension -In ".jpg", ".bmp", ".png") {
    $image.LoadFile($item.fullname)
    if ($image.Width -lt $image.Height) {
        Move-Item -LiteralPath $item.FullName -Destination "C:\target\folder"
    }
}

您可以直接从 PowerShell 或命令提示符运行此脚本:

powershell -File script.ps1 -ExecutionPolicy Unrestricted

相关内容