Announcement

Collapse
No announcement yet.

Über Kommandozeile Bilder in unterschiedlichen Ordnern verkleinern

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    #16
    Probiere mal dieses Skript:
    Code:
    @echo off
    cls
    setlocal
    
    rem Pfad fuer IrfanView
    set iview="%ProgramFiles%\IrfanView\i_view32.exe"
    
    rem Dateityp
    set filetype=*.jpg
    
    rem Breite
    set width=1000
    
    rem JPEG-Qualitaet
    set quality=100
    
    rem temporaere Datei
    set tmpfile="%temp%\imageinfo.txt"
    
    if not exist %iview% goto noIview
    if "%~1"=="" goto fehler
    
    echo Konvertierung . . .
    for /r "%~1" %%a in (%filetype%) do call :Resize "%%a"
    
    echo.
    echo Konvertierung abgeschlossen.
    goto end
    
    :fehler
    echo Kein Pfad angegeben!
    goto end
    
    :noiview
    echo IrfanView wurde nicht im angegebenen Pfad gefunden:
    %iview%
    goto end
    
    :resize
    echo Datei %1
    start /wait "IView" %iview% %1 /info=%tmpfile%
    set imagewidth=0
    for /f "tokens=4 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do set /a imagewidth=%%b
    if %imagewidth% gtr %width% start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /convert=%1
    goto :eof
    
    :end
    if exist %tmpfile% del %tmpfile%
    pause
    endlocal

    Comment


      #17
      Wow!! Ich suche schon seit Ewigkeiten nach so einem Script!
      Habe nur mal ein paar kleine Fragen damit ich das für meine Zwecke anpassen kann:

      Habs geschafft das Script so zu ändern, das ich bei Ausführung der Batch ohne einen Ordner draufzuschieben oder so Alle Dateien im Ordner C:\Test konvertiert und in meine Gewünschte Höhe und Breite konvertiert werden. Jetzt muss ich aber noch irgendwie die DPI-Zahl, die Farbtiefe, und OverwriteExisting und DeleteOriginal sowie ganz wichtig die AUSgabedatei irgendwie geändert bekommen. Die Eingangsdateien sollen nähmlich *.TIF Format haben und die Ausgabedateien *.jpg

      Kann mir irgendjemand vielleicht ein paar Tipps geben wie ich das ganze verwirklichen kann??

      Die Optionen müssen halt irgendwie genau so werden wie in dem Screenshot.





      Uploaded with ImageShack.us

      Comment


        #18
        Ich habs hinbekommen

        brauchte garnicht soeine komplizierte Batch-Datei.

        Ich hab das ganze einfach so gelöst:

        Code:
        @echo off
        echo Konvertierung der Etiketten laeuft.
        echo.
        echo Bitte einen Moment Geduld...
        C:\Irfanview\i_view32.exe "F:\Produktspezifikationen\GenerierteJPG-Etiketten\*.tif" /advancedbatch /resize=(2622,1146) /jpgq=100 /bpp=24 /convert="F:\Produktspezifikationen\GenerierteJPG-Etiketten\*.jpg"
        del "F:\Produktspezifikationen\GenerierteJPG-Etiketten\*.tif"      
        cls
        echo Konvertierung der Etiketten abgeschlossen.
        echo.
        echo Alle Etiketten wurden unter
        echo.
        echo F:\Produktspezifikationen\GenerierteJPG-Etiketten 
        echo.
        echo gespeichert.
        echo.
        echo.
        pause


        Das ganze war so wichtig für mich, weil der Irfanview bei mir über VBA gestartet wurde, und es irgendwie Probleme mit dem Eingangsverzeichnis gibt.

        Ungeachtet davon was in der (schreibgeschützten) ini stand, hat irfanview ganz immer mal wieder sporadisch nicht das fest eingestellte verzeichnis genommen, sondern war auf den Desktop des angemeldeten Users eingestellt. Nach Systemneustart gings wieder, aber die INI wollte er vorher nicht mehr nehmen.

        ganz phänomenal.

        hat man dann die irfanview.exe und .ini in ein neuen ordner kopiert und von da ausgeführt ging auch alles, wieder zurückkopiert und geht nicht.

        Ganz ganz merkwürdig.

        Aber egal denn jetzt muss ich diesen dämlichen Dialog nie wieder sehen.

        Das war nähmlich echt nervig, weil Irfanview halt über VBA gestartet wurde und dann nur per Autohotkey bedient wurde. (sendkey b, sendkey alt+d, sendkey alt+s, sendkeys alt+f4 = batchdialog öffnen, alle dateien im eingangsverzeichnis hinzufügen, starten, dann wenns fertig irfanview schliessen.) Wenn dann das Eingangsverzeichnis falsch ist klappt das ganze leider nicht. Aber über die Kommandozeile geht das einfach soooo viel besser

        Comment


          #19
          Hallo,
          ich bin Anfängerin und möchte gerne das (letzte) Script von "derniwi" an meine Bedürfnisse anpassen. Nur mit den Pfadangaben habe ich leider Probleme. Ich möchte nicht die Batchdatei durch hineinschieben von Ordnern starten, sondern den Batchjob fix für alle Datein im Ordner "d:/test" (inklusive Unterordner) durchführen. Könnt ihr mir vielleicht sagen, wie bzw. wo ich dies vorgeben muss/kann.

          "hmmka" schreibt ja, dass er es (genau dies was ich auch benötige) geschaft hat; nur leider hat er nicht gesagt wie. :-(

          Über eure Hilfe würde ich mich sehr freuen.
          Vielen Dank schonmal und liebe Grüße
          Claudi

          Comment


            #20
            Hallo Claudi,

            hilft dir das?

            Code:
            @echo off
            cls
            setlocal
            
            rem Pfad fuer IrfanView
            set iview="%ProgramFiles%\IrfanView\i_view32.exe" 
            
            rem Quellverzeichnis
            set quelle=c:\bilder
            
            rem Dateityp
            set filetype=*.jpg
            
            rem Breite
            set width=1000
            
            rem JPEG-Qualitaet
            set quality=100
            
            rem temporaere Datei
            set tmpfile="%temp%\imageinfo.txt"
            
            if not exist %iview% goto noIview
            if "%quelle%"=="" goto fehler
            
            echo Konvertierung . . .
            for /r "%quelle%" %%a in (%filetype%) do call :Resize "%%a"
            
            echo.
            echo Konvertierung abgeschlossen.
            goto end
            
            :fehler
            echo Kein Pfad angegeben!
            goto end
            
            :noiview
            echo IrfanView wurde nicht im angegebenen Pfad gefunden: %iview%
            goto end
            
            :resize
            echo Datei %1
            start /wait "IView" %iview% %1 /info=%tmpfile%
            set imagewidth=0
            for /f "tokens=4 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do set /a imagewidth=%%b
            if %imagewidth% gtr %width% start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /convert=%1
            goto :eof
            
            :end
            if exist %tmpfile% del %tmpfile%
            pause
            endlocal
            Gruß
            Nils

            Comment


              #21
              Hallo Nils,
              toll! Vielen Dank. Ich werds heute Abend ausprobieren.
              Könntest du mir vielleicht die Zeilen "for..." und ":resize..." etwas erklären, damit ich auch mal verstehen kann was da im einzelnen passiert? Die Irfan-Hilfe bringt mich hier bei meinem "Wissesdurst" nicht wirklich weiter. :-(
              Vielen herzlichen Dank nochmal und auch schon mal im Voraus
              Liebe Grüße
              Claudi

              Comment


                #22
                Hallo zusammen,

                ich habe mir dieses Thema im Forum intensiv durchgelesen, weil ich hoffe, dass es mich meinem Ziel näher bringt. Allerdings gebe ich zu anscheinend nicht genug von der Batchprogrammierung zu verstehen!

                :was ist das Ziel?
                ==================
                Mein Ziel ist mein komplettes Fotoarchiv, das auf d:\bilder\digitalkamera\'unterordner'\ liegt, auf meinem Samsung Galaxy S2 Smartphone synchron zu haben. Aus Platzgründen sollen die Fotos allerdings nicht in voller Auflösung, sondern verkleinert dort landen.
                Ich weiß, es gibt Picasa web alben + Apps für Android usw., aber ich möchte gerne selbst den Daumen darauf haben und dies steuern.

                :wie ist der Plan?
                ==================
                Schritt 1: Die Fotos werden per regelmäßig per Windows Aufgabenplanung verkleinert (lange Seite 800px) und mit der kompletten Unterordnerstruktur in d:\bilder\digitalkamera-lq\'unterordner'\ und der Namensergänzung "-LQ".jpg gespeichert.

                Schritt 2: Mein lieblings Schweizer Synchronisationsallzweckwerkzeug "AllwaySync pro" synchronisiert diesen Ordner dann auf meinen HiDrive cloud Account.

                Schritt 3: Mein Smartphone synchronisiert diesen Ordner von HiDrive per App zeitgesteuert auf seine microSD-Karte. Somit steht die Fotosammlung relativ aktuell auch immer auf dem Smartpphone zur Verfügung.

                :was kann ich schon?
                ====================
                Schritt 2 und Schritt 3 :-). Das mache ich mit einer Reihe von PDF Dateien bereits.

                :was kann ich noch nicht?
                =========================
                Schritt 1! Und genau hier suche ich eure Hilfe, um eine Batchdatei zu erstellen, die mit IrfanView genau diese Aufgabe erledigt.

                Kann jemand helfen?


                Viele Grüße
                Jan

                Comment


                  #23
                  Hallo Jan,

                  wenn du nicht noch ein paar Tage geduldest, kann ich mir das anschauen. Ein großes Problem sollte das nicht sein.

                  Gruß
                  Nisl

                  Comment


                    #24
                    Hallo Nils,

                    alles klar! Vielen Dank. Ich bin schon ganz gespannt.

                    Gruß,
                    Jan

                    Comment


                      #25
                      Hi,

                      ich habe noch ein paar Fragen:
                      a) sollen die Dateien immer neu verkleinert werden? Das wäre ja nicht unbedingt notwendig. Wenn die Zieldatei bereits existiert, kann man die überspringen. Problematisch wird es nur, wenn du die Bilder bearbeitest. Das Dateidatum mitzuverwalten ist ungleich mehr aufwand.
                      b) wie sieht es mit Löschungen aus? Wenn aus d:\bilder\digitalkamera\'unterordner'\ Bilder gelöscht werden, wie löschst du die entsprechenden aus d:\bilder\digitalkamera-lq\'unterordner'\ ? Könnte man auch über ein Skript machen, was aber nichts mehr mit IrfanView zu tun hat.

                      Hier ist schon mal eine Version, die funktionieren sollte. In der Annahme, dass bestehende Dateien nicht erneut verkleinert werden und Löschungen oder Umbenennungen in der Quelle manuell im Ziel durchgeführt werden. ;-)

                      Code:
                      @echo off
                      rem ********************
                      rem * BatchResize2.cmd *
                      rem ********************
                      rem This script will convert all the JPGs in the source directory and save
                      rem them into the destination directory. Existing pictures won't be changed.
                      rem If an image is small enough to not be converted it is just copied.
                      
                      rem Drag and drop a folder or folder structure to this script and IrfanView will
                      rem resize all pictures of the given file type to the given pixel size. Smaller
                      rem pictures will not be touched.
                      rem Also the jpeg quality could be set.
                      cls
                      setlocal
                      
                      rem Path to Irfan view
                      if /i "%PROCESSOR_ARCHITECTURE%" equ "AMD64" (
                       rem Path to IrfanView on x64 Windows
                       set iview="%ProgramFiles(x86)%\IrfanView\i_view32.exe"
                      ) else (
                       rem Path to IrfanView on x86 Windows
                       set iview="%ProgramFiles%\IrfanView\i_view32.exe"
                      )
                      if not exist %iview% goto noIview
                      
                      rem *********************************************
                      rem * You may change the variables in this part *
                      rem *********************************************
                      rem Source directory
                      set source=d:\bilder\digitalkamera
                      
                      rem Destination directory
                      set dest=d:\bilder\digitalkamera-lq
                      
                      rem File name extension
                      set ext=-LQ
                      
                      rem File type
                      set filetype=*.jpg
                      
                      rem Maximum size of the long side
                      set /a length=800
                      
                      rem JPEG quality
                      set quality=75
                      
                      rem *********************************************
                      rem * End of Changes                            *
                      rem *********************************************
                      
                      rem Temporary file
                      set tmpfile="%temp%\imageinfo.txt"
                      
                      rem Count lengths
                      call :strlen sourcelen source
                      call :strlen destlen dest
                      
                      echo Converting...
                      for /r "%source%" %%a in (%filetype%) do call :Resize "%%a" "%%~dpa" "%%~na" "%%~xa"
                      
                      echo.
                      echo Finished converting.
                      
                      rem After finishing go to the end
                      goto end
                      
                      
                      rem IrfanView could not be found.
                      :noiview
                      echo IrfanView not found in the given path:
                      echo   %iview%
                      goto end
                      
                      :resize
                      setlocal EnableDelayedExpansion
                      echo.
                      echo Checking file "%~1"
                      set sourcedir=%~2
                      set filename=%~3
                      set fileext=%~4
                      
                      rem Cut of the base source directory from the path
                      set sd=!sourcedir:~%sourcelen%!
                      
                      rem if the file is already converted, skip
                      if exist "%dest%%sd%%filename%%ext%%fileext%" (
                       echo File
                       echo  "%dest%%sd%%filename%%ext%%fileext%"
                       echo exists. Skipping.
                       goto resizeend
                      )
                      
                      rem Check destination directory
                      if not exist "%dest%%sd%" md "%dest%%sd%"
                      
                      rem Get the image dimensions of the source file
                      start /wait "IrfanView" %iview% %1 /info=%tmpfile%
                      set /a imagewidth=0
                      for /f "tokens=4,6 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do (set /a imagewidth=%%b) & (set /a imageheight=%%c)
                      
                      rem Check which is the longer side
                      if %imagewidth% lss %imageheight% set /a imagewidth=%imageheight%
                      
                      rem Check if the image has to be converted
                      if %imagewidth% gtr %length% (
                       echo Resizing file "%~1"
                       start /wait "IView" %iview% "%~1" /resize_long=%length% /aspectratio /resample /jpgq=%quality% /convert="%dest%%sd%%filename%%ext%%fileext%"
                      ) else (
                       copy "%~1" "%dest%%sd%%filename%%ext%%fileext%"
                      )
                      
                      :resizeend
                      endlocal
                      goto :eof
                      
                      
                      rem Count string length
                      rem Source: http://stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file
                      :strlen <resultVar> <stringVar>
                      (   
                       setlocal EnableDelayedExpansion
                       set "s=!%~2!#"
                       set "len=0"
                       for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
                        if "!s:~%%P,1!" NEQ "" ( 
                         set /a "len+=%%P"
                         set "s=!s:~%%P!"
                        )
                       )
                      )
                      ( 
                       endlocal
                       set "%~1=%len%"
                       exit /b
                      )
                      
                      rem End of the script
                      :end
                      if exist %tmpfile% del %tmpfile%
                      endlocal

                      Gruß
                      Nils
                      Last edited by derniwi; 09.08.2012, 05:51 PM.

                      Comment


                        #26
                        Hallo Nils,

                        wow! Vielen Dank für die ausführliche Antwort. Deine Annahme zu a) ist sehr richtig. Bereits existierende Dateien können natürlich übersprungen werden. Zu b) wäre eine Automatisierung natürlich super, aber ich werde erst einmal das Skript ausprobieren :-).


                        Gruß,
                        Jan

                        == Nachtrag 14.08.2012 - 20:31 ==

                        Hallo Nils,

                        ich bin echt platt. Habe das Skript in die xyz.CMD Datei kopiert und nach einem kurzen Test mit einem Dummy Verzeichnis möchte ich 'vielen Dank' sagen. Das Skript macht genau(!) das was ich möchte. Lob und Anerkennung für Deine Hilfe :-).

                        Nach dem kurzen Dummy Test konvertiert nun das Skript das echte Verzeichnis. Und wird wohl noch ein bisschen dafür brauchen ;-).

                        Einzig bleibt noch die Frage wie im Zielverzeichnis ein(e) im Quellverzeichnis gelöschte Datei/gelöschter Ordner wieder entfernt werden kann. Über einen Tipp in welcher Ecke des Skriptinguniversums das zu finden ist, bin ich dankbar.


                        Viele Grüße
                        Jan
                        Last edited by between_everything; 14.08.2012, 07:38 PM.

                        Comment


                          #27
                          Hallo,

                          ich habe auch mal eine Frage dazu,

                          Die Bilder konnte ich reibungslos verkleinern, allerdings wird ja das geänderte Datum dadurch leider geändert.

                          Gibt es eine Lösung die dieses Datum vor der Änderung auffängt und danach wieder zurückschreibt?

                          Des weiteren wäre noch interessant wie man Unterordner auschließen kann.

                          zB. C:\Bilder

                          mit Unterordnern

                          Fotos
                          Bilder
                          Groß
                          .
                          .
                          .


                          ausgeschlossen werden soll z.B. der Ordner Groß

                          Vielen Dank schonmal vorraus für die Hilfe

                          matzeer

                          Achso das Script hab ich fast vergessen:

                          @echo off
                          cls
                          setlocal

                          set Datum=%date%
                          echo Start_Konvertierung_%date%_%time:~0,2%-%time:~3,2%-%time:~6,2% >> "C:\Kit\Bilder_%Datum%.log"
                          echo INFO: hier werden nur Dateien aufgeführt die konvertiert wurden! >> "C:\Kit\Bilder_%Datum%.log"

                          rem Pfad fuer IrfanView
                          set iview="%ProgramFiles(X86)%\IrfanView\i_view32.exe"

                          rem Quellverzeichnis
                          set quelle=c:\bilder

                          rem Dateityp
                          set filetype=*.jpg;*.jpeg

                          rem Breite
                          set width=2048

                          rem JPEG-Qualitaet
                          set quality=100

                          rem temporaere Datei
                          set tmpfile="%temp%\imageinfo.txt"

                          if not exist %iview% goto noIview
                          if "%quelle%"=="" goto fehler

                          echo Bilder Konvertierung laueft . . .
                          for /r "%quelle%" %%a in (%filetype%) do call :check_size "%%a"

                          echo.
                          echo Konvertierung abgeschlossen.
                          goto end

                          :fehler
                          echo Kein Pfad angegeben!
                          goto end

                          :noiview
                          echo IrfanView wurde nicht im angegebenen Pfad gefunden: %iview%
                          goto end

                          :check_size
                          echo Datei %1
                          start /wait "IView" %iview% %1 /info=%tmpfile%
                          set imagewidth=0
                          for /f "tokens=4 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do set /a imagewidth=%%b
                          if %imagewidth% gtr %width% goto resize %1
                          goto :eof

                          :resize
                          echo %1 >> "C:\Kit\Bilder_%Datum%.log"
                          start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /convert=%1
                          goto :eof

                          :end
                          if exist %tmpfile% del %tmpfile%

                          echo Ende_Konvertierung_%date%_%time:~0,2%-%time:~3,2%-%time:~6,2% >> "C:\Kit\Bilder_%Datum%.log"
                          pause
                          endlocal
                          Last edited by matzeer; 10.08.2012, 01:45 PM.

                          Comment


                            #28
                            Hi,

                            ändere mal die Zeile
                            Code:
                             start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /convert=%1
                            in
                            Code:
                             start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /ini=%inidir% /advancedbatch /convert=%1
                            Am Anfang fügst du noch ein
                            Code:
                            set inidir=C:\Bilder_ini
                            ein und erstellst ein Verzeichnis
                            C:\Bilder_ini
                            Darin legst du eine Datei i_view32.ini mit folgendem Inhalt an:
                            Code:
                            [Batch]
                            AdvSaveOldDate=1
                            Das sollte das Problem mit dem Dateidatum beheben., sieht dann also so aus:
                            Code:
                            @echo off
                            cls
                            setlocal
                            
                            set Datum=%date%
                            echo Start_Konvertierung_%date%_%time:~0,2%-%time:~3,2%-%time:~6,2% >> "C:\Kit\Bilder_%Datum%.log"
                            echo INFO: hier werden nur Dateien aufgeführt die konvertiert wurden! >> "C:\Kit\Bilder_%Datum%.log"
                            
                            rem Pfad fuer IrfanView
                            set iview="%ProgramFiles(X86)%\IrfanView\i_view32.exe"
                            
                            rem Quellverzeichnis
                            set quelle=c:\bilder
                            
                            rem Verzeichnis der Ini-Datei
                            set inidir=C:\Bilder_ini
                            
                            rem Dateityp
                            set filetype=*.jpg;*.jpeg
                            
                            rem Breite
                            set width=2048
                            
                            rem JPEG-Qualitaet
                            set quality=100
                            
                            rem temporaere Datei
                            set tmpfile="%temp%\imageinfo.txt"
                            
                            if not exist %iview% goto noIview
                            if "%quelle%"=="" goto fehler
                            
                            echo Bilder Konvertierung laueft . . .
                            for /r "%quelle%" %%a in (%filetype%) do call :check_size "%%a"
                            
                            echo.
                            echo Konvertierung abgeschlossen.
                            goto end
                            
                            :fehler
                            echo Kein Pfad angegeben!
                            goto end
                            
                            :noiview
                            echo IrfanView wurde nicht im angegebenen Pfad gefunden: %iview%
                            goto end
                            
                            :check_size
                            echo Datei %1
                            start /wait "IView" %iview% %1 /info=%tmpfile%
                            set imagewidth=0
                            for /f "tokens=4 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do set /a imagewidth=%%b
                            if %imagewidth% gtr %width% goto resize %1
                            goto :eof
                            
                            :resize
                            echo %1 >> "C:\Kit\Bilder_%Datum%.log"
                            start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /ini=%inidir% /advancedbatch /convert=%1
                            goto :eof
                            
                            :end
                            if exist %tmpfile% del %tmpfile%
                            
                            echo Ende_Konvertierung_%date%_%time:~0,2%-%time:~3,2%-%time:~6,2% >> "C:\Kit\Bilder_%Datum%.log"
                            pause
                            endlocal
                            Das Problem mit dem Ausschluss von Verzeichnissen würde auch gehen, da muß ich aber nochmal an mein Skript ran.

                            Edit:
                            Hier meine Version mit Ausschluß von Verzeichnisses:
                            Code:
                            @echo off
                            rem ********************
                            rem * BatchResize2.cmd *
                            rem ********************
                            rem This script will convert all the JPGs in the source directory and save
                            rem them into the destination directory. Existing pictures won't be changed.
                            rem If an image is small enough to not be converted it is just copied.
                            
                            rem Drag and drop a folder or folder structure to this script and IrfanView will
                            rem resize all pictures of the given file type to the given pixel size. Smaller
                            rem pictures will not be touched.
                            rem Also the jpeg quality could be set.
                            cls
                            setlocal
                            
                            rem Path to Irfan view
                            if /i "%PROCESSOR_ARCHITECTURE%" equ "AMD64" (
                             rem Path to IrfanView on x64 Windows
                             set iview="%ProgramFiles(x86)%\IrfanView\i_view32.exe"
                            ) else (
                             rem Path to IrfanView on x86 Windows
                             set iview="%ProgramFiles%\IrfanView\i_view32.exe"
                            )
                            if not exist %iview% goto noIview
                            
                            rem *********************************************
                            rem * You may change the variables in this part *
                            rem *********************************************
                            rem Source directory
                            set source=d:\bilder\digitalkamera
                            
                            rem Destination directory
                            set dest=d:\bilder\digitalkamera-lq
                            
                            rem Exclude directories
                            set exclude=d:\bilder\digitalkamera\exclude.txt
                            set excludesub=d:\bilder\digitalkamera\excludesub.txt
                            
                            rem ini-directory
                            set inidir=d:\bilder\digitalkamera\iviewini
                            
                            rem File name extension
                            set ext=-LQ
                            
                            rem File type
                            set filetype=*.jpg
                            
                            rem Maximum size of the long side
                            set /a length=800
                            
                            rem JPEG quality
                            set quality=75
                            
                            rem *********************************************
                            rem * End of Changes                            *
                            rem *********************************************
                            
                            rem Temporary file
                            set tmpfile="%temp%\imageinfo.txt"
                            
                            rem Count lengths
                            call :strlen sourcelen source
                            call :strlen destlen dest
                            
                            echo Converting...
                            for /r "%source%" %%a in (%filetype%) do call :Resize "%%a" "%%~dpa" "%%~na" "%%~xa"
                            
                            echo.
                            echo Finished converting.
                            
                            rem After finishing go to the end
                            goto end
                            
                            
                            rem IrfanView could not be found.
                            :noiview
                            echo IrfanView not found in the given path:
                            echo   %iview%
                            goto end
                            
                            :resize
                            setlocal EnableDelayedExpansion
                            echo.
                            echo Checking file "%~1"
                            set sourcedir=%~2
                            set filename=%~3
                            set fileext=%~4
                            
                            rem Cut of the base source directory from the path
                            set sd=!sourcedir:~%sourcelen%!
                            
                            rem Exclude exactly named directories
                            if exist "%exclude%" (
                             type "%exclude%" | find.exe /i "#%ds%#"
                             if !errorlevel! equ 0 goto resizeend
                            )
                            
                            rem Exclude directories and sub directories
                            if exist "%excludesub%" (
                             type "%excludesub%" | find.exe /i "#%ds%"
                             if !errorlevel! equ 0 goto resizeend
                            )
                            
                            rem if the file is already converted, skip
                            if exist "%dest%%sd%%filename%%ext%%fileext%" (
                             echo File
                             echo  "%dest%%sd%%filename%%ext%%fileext%"
                             echo exists. Skipping.
                             goto resizeend
                            )
                            
                            rem Check destination directory
                            if not exist "%dest%%sd%" md "%dest%%sd%"
                            
                            rem Get the image dimensions of the source file
                            start /wait "IrfanView" %iview% %1 /info=%tmpfile%
                            set /a imagewidth=0
                            for /f "tokens=4,6 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do (set /a imagewidth=%%b) & (set /a imageheight=%%c)
                            
                            rem Check which is the longer side
                            if %imagewidth% lss %imageheight% set /a imagewidth=%imageheight%
                            
                            rem Check if the image has to be converted
                            if %imagewidth% gtr %length% (
                             echo Resizing file "%~1"
                             start /wait "IView" %iview% "%~1" /resize_long=%length% /aspectratio /resample /jpgq=%quality% /ini=%inidir% /advancedbatch /convert="%dest%%sd%%filename%%ext%%fileext%"
                            ) else (
                             copy "%~1" "%dest%%sd%%filename%%ext%%fileext%"
                            )
                            
                            :resizeend
                            endlocal
                            goto :eof
                            
                            
                            rem Count string length
                            rem Source: http://stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file
                            :strlen <resultVar> <stringVar>
                            (   
                             setlocal EnableDelayedExpansion
                             set "s=!%~2!#"
                             set "len=0"
                             for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
                              if "!s:~%%P,1!" NEQ "" ( 
                               set /a "len+=%%P"
                               set "s=!s:~%%P!"
                              )
                             )
                            )
                            ( 
                             endlocal
                             set "%~1=%len%"
                             exit /b
                            )
                            
                            rem End of the script
                            :end
                            if exist %tmpfile% del %tmpfile%
                            endlocal
                            In deinem Bilderverzeichnis legst du zwei Dateien an:
                            d:\bilder\digitalkamera\exclude.txt
                            d:\bilder\digitalkamera\excludesub.txt

                            In der Datei exclude.txt kommen die Verzeichnisse rein, die ausgeschlossen werden. Dabei solltest du folgendes Format verwenden:
                            #\verzeichnis1\verzeichnis2\#

                            Die "#" am Anfang und am Ende brauche ich, damit gleiche Verzeichnisnamen in verschiedenen Unterverzeichnissen vorkommen dürfen. "verzeichnis1" startet relativ zum Bilderverzeichnis, also
                            d:\bilder\digitalkamera\verzeichnis1\verzeichnis2\

                            Damit kannst du dann relativ einfach das Skript ändern, wenn du das Basisverzeichnis umbenennst.

                            Die zweite Datei, excludesub.txt, ist ähnlich aufgebaut, nur fehlt am Ende jedes Eintrags das "#". Damit werden dann auch Unterverzeichnisse nicht berücksichtigt.

                            Getestet habe ich das aber aktuell nicht.

                            Gruß
                            Nils
                            Last edited by derniwi; 10.08.2012, 08:54 PM. Reason: Ausschluss von Verzeichnissen

                            Comment


                              #29
                              Hallo Nils,

                              ich habe Dein Skript nun im vollen Einsatz. Wie oben schon gesagt macht es genau das was ich möchte. Allerdings kommt bei bei 0,01% der Bilder eine Popup Meldung von IrfanView hoch, die besagt "d:\bilder\digitalkamera\20xx\xyz.jpg : kann Dateiheader nicht lesen. Unbekanntes Dateiformat oder kann Datei existiert nicht." Wenn ich den Batchlauf abbreche, kann ich die Datei ganz normal mit IrfanView mir anzeigen lassen.

                              Was unterbindet diesen Fehler oder wie kann ich den zumindest automatisch übergehen?


                              Gruß,
                              Jan

                              Comment


                                #30
                                Hallo Jan,

                                das ist eine gute Frage.
                                Was passiert, wenn du das Skript mehrfach laufen läßt? Hat es dann immer bei den gleichen Dateien dieses Problem?

                                Hänge mal an die Zeile zur Umwandlung noch ein /slient an. Evtl. hilft dir das, damit das Skript nicht stehen bleibt.
                                Ich schaue mal, ob ich da noch eine Fehlerabfrage reinkriege und ob ich noch eine Protokolldatei erzeugen kann.

                                Gruß
                                Nils

                                Comment

                                Working...
                                X