Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Via Batch die Abmessung von JPG-Dateien auslesen und in bestimmte Ordner verschieben

Frage Entwicklung Batch & Shell

Mitglied: rg-87

rg-87 (Level 1) - Jetzt verbinden

14.08.2011, aktualisiert 18.10.2012, 5146 Aufrufe, 14 Kommentare

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
Mitglied: 64748
14.08.2011 um 12:00 Uhr
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
Bitte warten ..
Mitglied: bastla
14.08.2011, aktualisiert 18.10.2012
Hallo rg-87!

Sollte auch mit Bordmitteln gehen - zum Testen mit Deiner ungenannten Windows-Version nur mal mit einer (in Zeile 2 angegebenen) Datei:
01.
@echo off & setlocal 
02.
set "Datei=D:\PIC00001.JPG" 
03.
 
04.
set G=%temp%\GetExtAttr.vbs 
05.
 >%G% echo Set fso=CreateObject("Scripting.FileSystemObject"):Set Sh=CreateObject("Shell.Application") 
06.
>>%G% echo Set Fld=Sh.NameSpace(fso.GetParentFolderName(WScript.Arguments(0))) 
07.
>>%G% echo WScript.Echo Fld.ParseName(fso.GetFileName(WScript.Arguments(0))).ExtendedProperty("Dimensions") 
08.
 
09.
for /f "tokens=1,3" %%i in ('cscript //nologo %G% "%Datei%"') do set "W=%%i" & set "H=%%j" 
10.
if defined W echo %Datei%: %W%_%H%
Ähnliches hatten wir jedenfalls mal hier ...
[Edit] Um auch noch die Schleifen-Variante (incl "Verschiebe"-Ansatz) nachzureichen:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Bilder" 
03.
 
04.
set G=%temp%\GetExtAttr.vbs 
05.
 >%G% echo Set fso=CreateObject("Scripting.FileSystemObject"):Set Sh=CreateObject("Shell.Application") 
06.
>>%G% echo Set Fld=Sh.NameSpace(WScript.Arguments(0)):For Each File In Fld.Items 
07.
>>%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 
08.
 
09.
pushd "%Ordner%" 
10.
for /f "tokens=1-3 delims=|" %%i in ('cscript //nologo %G% "%Ordner%"') do ( 
11.
    echo %%i - Breite: %%j Hoehe: %%k 
12.
    if %%j geq 3000 (echo move "%%i" "D:\Bilder\sortiert\ab3000") else ( 
13.
	    if %%j geq 2000 (echo move "%%i" "D:\Bilder\sortiert\ab2000") else ( 
14.
            echo move "%%i" "D:\Bilder\sortiert\unter2000" 
15.
16.
17.
18.
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
Bitte warten ..
Mitglied: rubberman
14.08.2011 um 12:22 Uhr
Hallo rg-87.

Wenn du mit Bordmitteln arbeiten willst, kannst du ein VBScript nutzen.

getJpgDim.vbs
01.
If WScript.Arguments.Count < 1 Then WScript.Quit 2 
02.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
03.
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0)) 
04.
If Not objFSO.FolderExists(strSrcDir) Then WScript.Quit 1 
05.
Set objShell = CreateObject("Shell.Application") 
06.
For Each objFile In objFSO.GetFolder(strSrcDir).Files 
07.
  If LCase(objFSO.GetExtensionName(objFile.Name)) = "jpg" Then 
08.
    WScript.Echo objFile.Path & "?" & GetFileDimensions(objFile.Path) 
09.
  End If 
10.
Next 
11.
 
12.
Function GetFileDimensions(strFileFullName) 
13.
  If objFSO.FileExists(strFileFullName) Then 
14.
    Set objFolderItem = objShell.Namespace(objFSO.GetParentFolderName(strFileFullName)) _  
15.
      .ParseName(objFSO.GetFileName(strFileFullName)) 
16.
    GetFileDimensions = objFolderItem.ExtendedProperty("Dimensions") 
17.
  End If 
18.
End Function
Beispielaufruf im Batch
01.
@echo off &setlocal 
02.
set "SourcePath=D:\Pfad\zu\Bildern" 
03.
 
04.
for /f "tokens=1,2 delims=?" %%a in ('cscript //nologo getJpgDim.vbs "%SourcePath%"') do ( 
05.
  echo %%a 
06.
  echo %%b 
07.
  echo ---------------- 
08.
09.
 
10.
pause
Grüße
rubberman

<EDIT: Hallo bastla. Wie (fast) immer einen Hauch schneller />
<EDIT2: .Quit in der ersten Zeile ergänzt />
Bitte warten ..
Mitglied: 64748
14.08.2011 um 12:48 Uhr
Hallo nochmal,

ich hab hier mit Bordmitteln diese Lösung:
01.
#!/usr/bin/perl 
02.
 
03.
use strict; 
04.
use warnings; 
05.
 
06.
opendir ORDNER, "./" or die "geht nicht: $!\n"; 
07.
 
08.
my @bilder = grep { /\.jpg/ } readdir ORDNER; 
09.
 
10.
my $bild; 
11.
foreach $bild (@bilder) { 
12.
    my ($name, $format, $res, $a, $b, $c, $size, $d, $e) = split /\s/, `identify $bild`; 
13.
    my ($breite, $hoehe) = split "x", $res; 
14.
    if ($hoehe > 1000) { 
15.
        system ("cp $name GrosseBilder"); 
16.
17.
    else { 
18.
        system ("cp $name KleineBilder"); 
19.
20.
}
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
Bitte warten ..
Mitglied: rubberman
14.08.2011 um 12:56 Uhr
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...

Grüße
rubberman
Bitte warten ..
Mitglied: 64748
14.08.2011 um 13:04 Uhr
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...
naja, ich auch. Ich hab hier Slackware64-13.37, normale Installation, da sind das die Bordmittel

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
Bitte warten ..
Mitglied: rubberman
14.08.2011 um 13:31 Uhr
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 ).

Auch dir einen schönen Sonntag.
rubberman
Bitte warten ..
Mitglied: rg-87
14.08.2011 um 13:36 Uhr
Das nen ich Hilfe
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.
Bitte warten ..
Mitglied: 64748
14.08.2011 um 13:47 Uhr
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
Bitte warten ..
Mitglied: bastla
14.08.2011 um 14:08 Uhr
Hallo rubberman!

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

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
14.08.2011 um 14:16 Uhr
Hallo bastla,

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

Grüße
rubberman
Bitte warten ..
Mitglied: rg-87
14.08.2011 um 14:38 Uhr
Hmm, das Skript listet alles fein säuberlich auf.
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.
Bitte warten ..
Mitglied: bastla
14.08.2011 um 14:41 Uhr
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):
01.
md "D:\Bilder\sortiert\%%jx%%k" 2>nul 
02.
echo move "%%i" "D:\Bilder\sortiert\%%jx%%k"
Grüße
bastla
Bitte warten ..
Mitglied: rubberman
14.08.2011 um 14:46 Uhr
Hallo rg-87,

ungetestet zu meinem Script, folgender Aufruf:
01.
@echo off &setlocal 
02.
set "SourcePath=D:\Pfad\zu\Bildern" 
03.
 
04.
for /f "tokens=1,2 delims=?" %%a in ('cscript //nologo getJpgDim.vbs "%SourcePath%"') do ( 
05.
  md "%SourcePath%\%%b" 2>nul 
06.
  move "%%a" "%SourcePath%\%%b\" 
07.
)
Grüße
rubberman
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch: bestimmte Datei finden und den Ordner verschieben
gelöst Frage von Gari.onBatch & Shell9 Kommentare

Hallo! ich hoffe ich bin hier richtig, es geht um folgendes Problem: in einem Ordner liegen mehrere Unterordner mit ...

Batch & Shell
Batch bestimmte Dateien verschieben ohne Ordnerstruktur
gelöst Frage von OOmatrixOOBatch & Shell14 Kommentare

Hallo. Ich möchte aus mehreren Ordnern und Unterordnern bestimmte Dateien in ein anderes Verzeichnis verschieben. Habe schon dies probiert: ...

Batch & Shell
Batch Datei erstellen - bestimmte Dateien verschieben
Frage von KingKoengBatch & Shell2 Kommentare

Hallo zusammen, ich benötige ein Batch dass mir per Parameter-Übergabe bestimmte Dateien von einem Verzeichnis ins andere verschiebt. Bspl: ...

Batch & Shell
Per Batch Dateien in Ordner mit bestimmter Zahl im Ordnernamen verschieben.
gelöst Frage von fiedelioBatch & Shell4 Kommentare

Hallo zusammen, ich bin neu hier im Forum und möchte gerne bei folgendem um Hilfe bitten: Ich versuche per ...

Neue Wissensbeiträge
Viren und Trojaner

Deaktivierter Keylogger in HP Notebooks entdeckt

Information von bitcoin vor 4 StundenViren und Trojaner

Ein Grund mehr warum man Vorinstallationen der Hersteller immer blank bügeln sollte Der deaktivierte Keylogger findet sich im vorinstallierten ...

Router & Routing

Lets Encrypt kommt auf die FritzBox

Information von bitcoin vor 8 StundenRouter & Routing

In der neuesten Labor-Version der FB7490 integriert AVM unter anderem einen Let's Encrypt Client für Zugriffe auf das Webinterface ...

Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 3 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Heiß diskutierte Inhalte
Batch & Shell
Trusted Sites für alle User auf dem PC einpflegen
Frage von xXTaKuZaXxBatch & Shell12 Kommentare

Aufgabestellung: Es sollen auf 1 PC (bzw. mehreren PCs) vertrauenswürdige Sites per Powershell eingetragen werden, die für alle User ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Cloud-Dienste
PIM als SaaS Nutzungsgebühr
Frage von vanTastCloud-Dienste8 Kommentare

Moin, wir haben uns ein PIM (Product Information Management) nach unseren Ansprüchen für viel Geld als SaaS-Lösung bauen lassen. ...

Vmware
DOS 6.22 in VMWare mit CD-ROM
gelöst Frage von hesperVmware7 Kommentare

Hallo zusammen! Ich hab ein saublödes Problem. Es ist eine VMWare mit DOS 6.22 zu erstellen auf dem ein ...