2016-04-12 9 views
2

Bir grup görüntü dosyası içeren bir klasöre sahip olduğumu varsayın. vb JPG, PNG I will Toplu komut dosyası yaratmak istiyoruz:Tüm yatay yönlendirilmiş fotoğrafları kendi alt dizinlerine taşımak için komut dosyası toplu iş akışı

her dosya için her dosya
2) ile 1) döngü, görüntü genişliği, resim yüksekliğinin
3) duruma göre daha fazla olup olmadığını kontrol doğru, manzara adlı bir alt dizine taşıyın.

# 1 ve # 3'ü nasıl yapacağımı biliyorum, ancak # 2'ye nasıl gidileceğini kaybettim. CMD bunu doğal olarak yapamaz.

+1

Lütfen sorularınızı sadece (2) adetlere dahil etmek üzere – knocte

cevap

0

CMD bunu doğal olarak yapamaz. Bununla birlikte, bazı 3. parti programlar (IrfanView ve ImageMagick iki isim), programla karşılaştırmanızı yapabilmeniz için gereken çıktıyı verebilecek komut satırı seçenekleriyle birlikte vardır.

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

Veya Görüntü :: Boyutu ile yerine perl kullanın:: ve zaten var ne genişlik bulabiliriz edilir ve dolayısıyla yükseklik ImageMagick kullanarak

0

#!/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

Bir .NET yöntemi kullanabilirsiniz Görüntü boyutlarını elde etmek için O zaman herhangi bir üçüncü parti araçlara veya kütüphaneye güvenmeniz gerekmeyecek. İşte, bir System.Drawing.Image object oluşturmak ve boyutlarına erişmek için [System.Drawing.Image]::FromFile()'u çağırmak üzere PowerShell karma kodunu kullanan bir örnek. Bir .bat uzantısı ile kaydedin ve ne düşündüğünüzü görün. Aslında


<# : 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 

, toplu kapsamında dosyaların fazla işlem bağlı olduğu değilse, tek PowerShell oturumdaki dosyalar arasında çok daha hızlı döngü olacak. Bunu bir .bat veya bir .ps1 uzantısıyla kaydedin ve farkı göreceksiniz.

<# : 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 
    } 
}