54249
Goto Top

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

Content-Key: 171459

Url: https://administrator.de/contentid/171459

Printed on: April 19, 2024 at 19:04 o'clock

Mitglied: 64748
64748 Aug 14, 2011 at 10:00:29 (UTC)
Goto Top
Hallo rg-87,

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
das solltest Du auch in einem Script verwenden können. Welches Betriebssystem nutzt Du denn? oder anders gefragt, hast Du Perl installiert?

Gruß

Markus
Member: bastla
bastla Aug 14, 2011, updated at Oct 18, 2012 at 16:47:54 (UTC)
Goto Top
Hallo rg-87!

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%
Ähnliches hatten wir jedenfalls mal hier ...
[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
Wegen des jeweiligen "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
Member: rubberman
rubberman Aug 14, 2011 at 10:22:20 (UTC)
Goto Top
Hallo rg-87.

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 face-wink />
<EDIT2: .Quit in der ersten Zeile ergänzt />
Mitglied: 64748
64748 Aug 14, 2011 at 10:48:22 (UTC)
Goto Top
Hallo nochmal,

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");  
    }
}
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
Member: rubberman
rubberman Aug 14, 2011 at 10:56:34 (UTC)
Goto Top
Hallo Markus.
Zitat von @64748:
ich hab hier mit Bordmitteln diese Lösung:
[...]
Perl und imagemagick muss installiert sein.

Unter "mit Bordmitteln" verstehen zumindest bastla und ich so etwas wie "ohne zusätzliche Installation". Ist aber egal, das Ergebnis zählt... face-wink

Grüße
rubberman
Mitglied: 64748
64748 Aug 14, 2011 at 11:04:17 (UTC)
Goto Top
Hallo rubberman,
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... face-wink
naja, ich auch. Ich hab hier Slackware64-13.37, normale Installation, da sind das die Bordmittel face-wink

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
Member: rubberman
rubberman Aug 14, 2011 at 11:31:08 (UTC)
Goto Top
Hallo Markus.

Das #!/usr/bin/perl hätte mir eigentlich schon sagen müssen, dass du dich auf Linux beziehst. So ist es, wenn man den Code gar nicht erst liest (weil man ihn nicht versteht face-wink).

Auch dir einen schönen Sonntag.
rubberman
Mitglied: 54249
54249 Aug 14, 2011 at 11:36:04 (UTC)
Goto Top
Das nen ich Hilfe face-smile
Nun zu der Frage welches Betriebssystem eingesetzt wird. -> Windows 7
Bordmittel immer gerne genommen.

Ich probier da jetzt mal was aus und melde mich dann mit einem Ergebnis.

Danke für die Hilfe.
Mitglied: 64748
64748 Aug 14, 2011 at 11:47:53 (UTC)
Goto Top
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
Member: bastla
bastla Aug 14, 2011 at 12:08:09 (UTC)
Goto Top
Hallo rubberman!

In Zeile 1 ist Dir ein ".Quit" abhanden gekommen ...

Grüße
bastla
Member: rubberman
rubberman Aug 14, 2011 at 12:16:26 (UTC)
Goto Top
Hallo bastla,

danke, ich hab's wiedergefunden und an die richtige Stelle gelegt face-wink

Grüße
rubberman
Mitglied: 54249
54249 Aug 14, 2011 at 12:38:59 (UTC)
Goto Top
Hmm, das Skript listet alles fein säuberlich auf. face-smile
Jedoch bin ich nicht in der Lage, die Dateien anhand ihrer Abmessung in einen Unterordner zu verschieben.
Der Unterordner trägt die Abmessung als Ordnername.
Member: bastla
bastla Aug 14, 2011 at 12:41:27 (UTC)
Goto Top
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):
md "D:\Bilder\sortiert\%%jx%%k" 2>nul  
echo move "%%i" "D:\Bilder\sortiert\%%jx%%k"  
Grüße
bastla
Member: rubberman
rubberman Aug 14, 2011 at 12:46:32 (UTC)
Goto Top
Hallo rg-87,

ungetestet zu meinem Script, folgender Aufruf:
@echo off &setlocal
set "SourcePath=D:\Pfad\zu\Bildern"  

for /f "tokens=1,2 delims=?" %%a in ('cscript //nologo getJpgDim.vbs "%SourcePath%"') do (  
  md "%SourcePath%\%%b" 2>nul  
  move "%%a" "%SourcePath%\%%b\"  
)

Grüße
rubberman