
54249
14.08.2011, aktualisiert am 18.10.2012
Via Batch die Abmessung von JPG-Dateien auslesen und in bestimmte Ordner verschieben
Hallo liebe Administrator.de-Gemeinde,
ich bekomme regelmäßig Ordner mit JPG-Dateien welche eine unterschiedliche Auflösung besitzen (2800x3633, 1000x744, usw.)
Jetzt würde ich gerne automatisiert, die JPG-Dateien anhand Ihrer Auflösung in bestimmte Ordner verschieben.
Das verschieben von Dateien sollte kein Problem sein, jedoch das Auslesen der Abmessung via Batch.
Ist das überhaupt möglich?
Danke im Voraus.
rg-87
ich bekomme regelmäßig Ordner mit JPG-Dateien welche eine unterschiedliche Auflösung besitzen (2800x3633, 1000x744, usw.)
Jetzt würde ich gerne automatisiert, die JPG-Dateien anhand Ihrer Auflösung in bestimmte Ordner verschieben.
Das verschieben von Dateien sollte kein Problem sein, jedoch das Auslesen der Abmessung via Batch.
Ist das überhaupt möglich?
Danke im Voraus.
rg-87
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 171459
Url: https://administrator.de/forum/via-batch-die-abmessung-von-jpg-dateien-auslesen-und-in-bestimmte-ordner-verschieben-171459.html
Ausgedruckt am: 14.05.2025 um 03:05 Uhr
14 Kommentare
Neuester Kommentar

Hallo rg-87,
bei Imagemagick gibt's das Tool "identify". Download hier: http://www.imagemagick.org/script/index.php
Beispiel hier
das solltest Du auch in einem Script verwenden können. Welches Betriebssystem nutzt Du denn? oder anders gefragt, hast Du Perl installiert?
Gruß
Markus
bei Imagemagick gibt's das Tool "identify". Download hier: http://www.imagemagick.org/script/index.php
Beispiel hier
markus@samsung:~/MeineBilder$ identify CIMG0194.jpg
CIMG0194.jpg JPEG 1520x2032 1520x2032+0+0 8-bit DirectClass 522KB 0.000u 0:00.000
Gruß
Markus
Hallo rg-87!
Sollte auch mit Bordmitteln gehen - zum Testen mit Deiner ungenannten Windows-Version nur mal mit einer (in Zeile 2 angegebenen) Datei:
Ähnliches hatten wir jedenfalls mal hier ...
[Edit] Um auch noch die Schleifen-Variante (incl "Verschiebe"-Ansatz) nachzureichen:
Wegen des jeweiligen "
Soferne es sich bei den Zielordnern um Unterordner von "%Ordner%" handeln sollte, kann der Pfad dafür weg gelassen werden (während der Verarbeitung ist der "Bilder"-Ordner lt Zeile 2 aktuell).
Grüße
bastla
Sollte auch mit Bordmitteln gehen - zum Testen mit Deiner ungenannten Windows-Version nur mal mit einer (in Zeile 2 angegebenen) Datei:
@echo off & setlocal
set "Datei=D:\PIC00001.JPG"
set G=%temp%\GetExtAttr.vbs
>%G% echo Set fso=CreateObject("Scripting.FileSystemObject"):Set Sh=CreateObject("Shell.Application")
>>%G% echo Set Fld=Sh.NameSpace(fso.GetParentFolderName(WScript.Arguments(0)))
>>%G% echo WScript.Echo Fld.ParseName(fso.GetFileName(WScript.Arguments(0))).ExtendedProperty("Dimensions")
for /f "tokens=1,3" %%i in ('cscript //nologo %G% "%Datei%"') do set "W=%%i" & set "H=%%j"
if defined W echo %Datei%: %W%_%H%
[Edit] Um auch noch die Schleifen-Variante (incl "Verschiebe"-Ansatz) nachzureichen:
@echo off & setlocal
set "Ordner=D:\Bilder"
set G=%temp%\GetExtAttr.vbs
>%G% echo Set fso=CreateObject("Scripting.FileSystemObject"):Set Sh=CreateObject("Shell.Application")
>>%G% echo Set Fld=Sh.NameSpace(WScript.Arguments(0)):For Each File In Fld.Items
>>%G% echo If LCase(fso.GetExtensionName(File))="jpg" Then:D=Split(Fld.ParseName(File).ExtendedProperty("Dimensions")):WScript.Echo File^&"|"^&D(0)^&"|"^&D(2):End If:Next
pushd "%Ordner%"
for /f "tokens=1-3 delims=|" %%i in ('cscript //nologo %G% "%Ordner%"') do (
echo %%i - Breite: %%j Hoehe: %%k
if %%j geq 3000 (echo move "%%i" "D:\Bilder\sortiert\ab3000") else (
if %%j geq 2000 (echo move "%%i" "D:\Bilder\sortiert\ab2000") else (
echo move "%%i" "D:\Bilder\sortiert\unter2000"
)
)
)
popd
echo
" (zum Testen) vor dem "move
" werden die Befehle für das Verschieben nur angezeigt, aber noch nicht ausgeführt.Soferne es sich bei den Zielordnern um Unterordner von "%Ordner%" handeln sollte, kann der Pfad dafür weg gelassen werden (während der Verarbeitung ist der "Bilder"-Ordner lt Zeile 2 aktuell).
Grüße
bastla
Hallo rg-87.
Wenn du mit Bordmitteln arbeiten willst, kannst du ein VBScript nutzen.
getJpgDim.vbs
Beispielaufruf im Batch
Grüße
rubberman
<EDIT: Hallo bastla. Wie (fast) immer einen Hauch schneller
/>
<EDIT2:
Wenn du mit Bordmitteln arbeiten willst, kannst du ein VBScript nutzen.
getJpgDim.vbs
If WScript.Arguments.Count < 1 Then WScript.Quit 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0))
If Not objFSO.FolderExists(strSrcDir) Then WScript.Quit 1
Set objShell = CreateObject("Shell.Application")
For Each objFile In objFSO.GetFolder(strSrcDir).Files
If LCase(objFSO.GetExtensionName(objFile.Name)) = "jpg" Then
WScript.Echo objFile.Path & "?" & GetFileDimensions(objFile.Path)
End If
Next
Function GetFileDimensions(strFileFullName)
If objFSO.FileExists(strFileFullName) Then
Set objFolderItem = objShell.Namespace(objFSO.GetParentFolderName(strFileFullName)) _
.ParseName(objFSO.GetFileName(strFileFullName))
GetFileDimensions = objFolderItem.ExtendedProperty("Dimensions")
End If
End Function
Beispielaufruf im Batch
@echo off &setlocal
set "SourcePath=D:\Pfad\zu\Bildern"
for /f "tokens=1,2 delims=?" %%a in ('cscript //nologo getJpgDim.vbs "%SourcePath%"') do (
echo %%a
echo %%b
echo ----------------
)
pause
Grüße
rubberman
<EDIT: Hallo bastla. Wie (fast) immer einen Hauch schneller
<EDIT2:
.Quit
in der ersten Zeile ergänzt />
Hallo nochmal,
ich hab hier mit Bordmitteln diese Lösung:
Das Skript läuft im Ordner wo die Bilder sind, sonst muss der Pfad angepasst werden.
Perl und imagemagick muss installiert sein.die Namen "GrosseBilder" und "KleineBilder" sind die Verzeichnisse für die Bilder. Du kannst auch die Variable $size heranziehen wenn Du nach Dateigröße selektieren möchtest.
Gruß
Markus
ich hab hier mit Bordmitteln diese Lösung:
#!/usr/bin/perl
use strict;
use warnings;
opendir ORDNER, "./" or die "geht nicht: $!\n";
my @bilder = grep { /\.jpg/ } readdir ORDNER;
my $bild;
foreach $bild (@bilder) {
my ($name, $format, $res, $a, $b, $c, $size, $d, $e) = split /\s/, `identify $bild`;
my ($breite, $hoehe) = split "x", $res;
if ($hoehe > 1000) {
system ("cp $name GrosseBilder");
}
else {
system ("cp $name KleineBilder");
}
}
Perl und imagemagick muss installiert sein.die Namen "GrosseBilder" und "KleineBilder" sind die Verzeichnisse für die Bilder. Du kannst auch die Variable $size heranziehen wenn Du nach Dateigröße selektieren möchtest.
Gruß
Markus

Hallo rubberman,

Aber ich habe bei nochmaligem Lesen des Beitrags vom TO gelesen, dass er batch meint, also Windows (es gibt Perl auch für Windows und wenn man der Perl-Mailingliste glauben darf wird's auch von vielen Admins eingesetzt http://strawberryperl.com/).
Gruß und noch einen schönen Sonntag
Markus
Zitat von @rubberman:
Unter "mit Bordmitteln" verstehen zumindest bastla und ich so etwas wie "ohne zusätzliche Installation".
Ist aber egal, das Ergebnis zählt...
naja, ich auch. Ich hab hier Slackware64-13.37, normale Installation, da sind das die Bordmittel Unter "mit Bordmitteln" verstehen zumindest bastla und ich so etwas wie "ohne zusätzliche Installation".
Ist aber egal, das Ergebnis zählt...
Aber ich habe bei nochmaligem Lesen des Beitrags vom TO gelesen, dass er batch meint, also Windows (es gibt Perl auch für Windows und wenn man der Perl-Mailingliste glauben darf wird's auch von vielen Admins eingesetzt http://strawberryperl.com/).
Gruß und noch einen schönen Sonntag
Markus

Hallo rubberman,
wenn der Dateiname des Programms ein .pl-Suffix hat, also z.B. bilder.pl, dann kann man den gleichen Code auch auf einem Windowsrechner (wenn Perl installiert ist) laufen lassen (weil das "#" in der ersten Zeile auf nicht-Unix Systemen nur als Anfang einer Kommentarzeile aufgefasst wird).
Markus
wenn der Dateiname des Programms ein .pl-Suffix hat, also z.B. bilder.pl, dann kann man den gleichen Code auch auf einem Windowsrechner (wenn Perl installiert ist) laufen lassen (weil das "#" in der ersten Zeile auf nicht-Unix Systemen nur als Anfang einer Kommentarzeile aufgefasst wird).
Markus
Hallo rg-87!
Da Du nicht so genau beschrieben hattest, wie die Zielordner heißen sollen, habe ich im (inzwischen ergänzten) Schleifen-Ansatz oben Annahmen treffen müssen - da sich aber Breite und Höhe in den Variablen %%j und %%k befinden, kannst Du daraus ja den benötigten Ordnernamen zusammensetzen - etwa so (als Ersatz der Zeilen 12-16):
Grüße
bastla
Da Du nicht so genau beschrieben hattest, wie die Zielordner heißen sollen, habe ich im (inzwischen ergänzten) Schleifen-Ansatz oben Annahmen treffen müssen - da sich aber Breite und Höhe in den Variablen %%j und %%k befinden, kannst Du daraus ja den benötigten Ordnernamen zusammensetzen - etwa so (als Ersatz der Zeilen 12-16):
md "D:\Bilder\sortiert\%%jx%%k" 2>nul
echo move "%%i" "D:\Bilder\sortiert\%%jx%%k"
bastla