2016-04-12 2 views
2

Angenommen, ich habe einen Ordner, der eine Reihe von Bilddateien enthält. JPG, PNG, usw. Ich mag eine Batch-Skript erstellen, das wird:Stapelscript zum Verschieben aller landschaftsorientierten Fotos in ein eigenes Unterverzeichnis

1) Schleife durch jede für jede Datei
2) Datei, überprüfen, ob die Bildbreite ist größer als die Bildhöhe
3), wenn true, bewege dich in ein Unterverzeichnis namens landscape.

Ich weiß, wie # 1 und # 3 zu tun, aber ich bin verloren auf, wie man # 2 geht.

+1

Bitte formulieren Sie Ihre Frage um nur Details über (2) – knocte

Antwort

0

CMD kann das nativ nicht tun. Es gibt jedoch einige Programme von Drittanbietern (IrfanView und ImageMagick, um zwei zu nennen) mit Befehlszeilenoptionen, die Ihnen die Ausgabe geben können, die Sie benötigen, um Ihren Vergleich programmatisch durchführen zu können.

0

Mit ImageMagick und was Sie bereits haben Sie Breite und Höhe thusly finden konnte:

WIDTH="$(identify -format %w IMAGE)" 
    HEIGHT="$(identify -format %h IMAGE)" 
    if [ WIDTH -gt HEIGHT ]; then 
     # Move image to landscape folder 
    fi 

Oder verwenden Perl statt mit Bild :: Größe:

#!/usr/bin/env perl 
    use Cwd; 
    use Image::Size; 
    my $landscape_dir = "/path/to/landscape_dir"; 
    my $Parent = shift @ARGV; 
    my @img_list = map { Cwd::abs_path($_) } glob "*.jpg"; 
    foreach(@img_list){ 
     my ($w, $h) = imgsize("$_"); 
     if($w > $h){ 
     # Is landscape 
     system("/bin/mv $_ $landscape_dir"); 
     }else{ 
     # Is not landscape, do something else 
     } 
    } 
3

könnten Sie eine .NET-Methode verwenden um die Bildmaße zu erhalten. Dann müssten Sie sich nicht auf Tools oder Bibliotheken von Drittanbietern verlassen. Hier ist ein Beispiel, das PowerShell-Hybridcode verwendet, um [System.Drawing.Image]::FromFile() aufzurufen, um eine System.Drawing.Image object zu erstellen und auf seine Dimensionen zuzugreifen. Speichern Sie es mit einer BAT-Erweiterung und sehen Sie, was Sie denken.

<# : Batch portion (PowerShell multi-line comment) 
@echo off & setlocal 

rem # move landscape pics to what directory? 
2>NUL md landscape 

for %%I in (*.jpg *.bmp *.gif *.png) do (
    call :isLandscape "%%~fI" && (
     rem # remove "echo" when satisfied that this works as desired 
     echo move "%%~fI" landscape\ 
    ) || (
     echo %%~fI was portrait 
    ) 
) 

goto :EOF 

:isLandscape <imgfile> 
rem # function sets errorlevel 0 if landscape, 1 if portrait or square 
setlocal disabledelayedexpansion 
set "img=%~1" 
powershell -noprofile -noninteractive "iex (${%~f0} | out-string)" 
endlocal & exit /b %errorlevel% 

: end batch/begin PowerShell hybrid code #> 

add-type -Assembly System.Windows.Forms 
$size = [Drawing.Image]::FromFile((gi $env:img)).Size 
exit ($size.Width -le $size.Height) # 0 = false, 1 = true 

Eigentlich, wenn Sie nicht, dass an einer Weiterverarbeitung der Dateien im Batch-Kontext sind, wird es sehr viel schneller eine Schleife durch die Dateien in einer einzigen Powershell-Sitzung sein. Speichern Sie dies mit einer .bat- oder einer .ps1-Erweiterung, und Sie werden den Unterschied sehen.

<# : batch portion 
@echo off & setlocal 

powershell -noprofile -noninteractive "iex (${%~f0} | out-string)" 
goto :EOF 

: end batch/begin PowerShell #> 

add-type -Assembly System.Windows.Forms 
$newdir = "landscape" 

if (-not (test-path $newdir)) { md $newdir } 

gci | ?{ $_.Name -match "\.(jpe?g|bmp|gif|png)$" } | %{ 

    $size = [Drawing.Image]::FromFile($_).Size 
    if ($size.Width -gt $size.Height) { 
     # remove the -whatif flag to enable moves 
     mv $_.FullName $newdir -whatif 
    } else { 
     write-host ("{0} was portrait. Not moving." -f $_.FullName) -f cyan 
    } 
} 
Verwandte Themen