Announcement

Collapse
No announcement yet.

Befehle verketten

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

    Befehle verketten

    Ich habe Probleme beim Verketten von Befehlen. Alternativ wollte ich die Verkettung in einzelne Schritte aufteilen, leider bekomme es nicht hin, dass ich dann den temporären Dateinamen wieder als Input für den nächsten Schritt bekomme. Hier das Beispiel der Verkettung:

    Code:
    @echo off
    cls
    setlocal enabledelayedexpansion
    
    :: --- Konfiguration --->
    
    :: Pfadangabe zu IrfanView
    set iview=C:\Program Files (x86)\IrfanView\i_view32.exe
    
    :: Bildinfo-Datei
    set nfofile=info.txt
    
    :: <--- Konfiguration ---
    ::echo AAAAAAAAAAAAAAAAAAAAAAAAAAAA
    
    if "%~1"=="" (
       echo LEER
       echo Abbruch^^!
       echo Fehlender Parameter.
    ) else (
       echo NICHT LEER
       echo   Bildname: "%~nx1"
       "%iview%" "%~1" /info="%TMP%\%nfofile%"
       for /f "tokens=4,6 delims= " %%a in ('find "dimensions" "%TMP%\%nfofile%"') do (
          set width=%%a
          set height=%%b
       )
       echo    width : !width! Pixel
       set /a width1 = !width! 71 / 100
       echo   width1 : !width1! Pixel
       set /a height1 = !height!
       echo   height1: !height1! Pixel
    
       IF "%height%" GTR "%width%" (
         echo height größer als width
       ) ELSE (
         echo height kleiner als width
         set /a x     = !height1! * 80 / 79
         set /a x     = !width1! - !x!
         set /a x     = !x! / 2
         set /a width2 = !height1! * 80 /79
         set /a y = !height1!
         set /a height2 = !height1!
       )
       echo   width2 : !width2! Pixel
       echo   height2: !height2! Pixel
       echo        x : !x! Pixel
       echo        y : !y! Pixel
       "%iview%" "%~1" /resize=^(!width1!,!height1!^) /crop=^(!x!,!y!,!width2!,!height2!^) /resize=^(80,79^) /convert="$Dnew\$N_$Wx$H$O"
    
    )
    
    if exist "%TMP%\%nfofile%" del "%TMP%\%nfofile%"
    
    
    endlocal
    PS: Ich habe einen neuen Thread aufgemacht, da der andere auf gelöst gesetzt wurde. Ich hoffe, dass das richtig ist.

    #2
    Fehlt da zuallererst in Zeile 29:

    Code:
    set /a width1 = !width! 71 / 100
    nicht ein Operator?
    »Und so, in eurer Verzweiflung, kommt ihr zu mir.«

    Texteditor EmEditor:
    Deutsche Sprachdatei (v7.01) für EmEditor Pro 7.02 (englisch)
    EmEditor Pro 8.06 (deutsch) | Deutsche Sprachdatei (v8) für EmEditor Pro 8.06 (englisch)
    Deutsche Sprachdatei (v9.16) für EmEditor Pro 9.17 (englisch)

    Comment


      #3
      Vielen Dank, das stimmt. Das war noch eine "kleine Optimierung" zum Schluss.

      Dennoch bleibt das Problem bestehen, dass ich am Ende kein Bild der Größe 80 x 79 herausbekomme. Im Ordner "new" wird ein Bild mit der Größe 418x179 abgelegt. Daher dachte ich, dass die letzten beiden Befehle crop und resize ignoriert werden.
      @echo off
      cls
      setlocal enabledelayedexpansion

      :: --- Konfiguration --->

      :: Pfadangabe zu IrfanView
      set iview=C:\Program Files (x86)\IrfanView\i_view32.exe

      :: Bildinfo-Datei
      set nfofile=info.txt

      :: <--- Konfiguration ---
      ::echo AAAAAAAAAAAAAAAAAAAAAAAAAAAA

      if "%~1"=="" (
      echo LEER
      echo Abbruch^^!
      echo Fehlender Parameter.
      ) else (
      echo NICHT LEER
      echo Bildname: "%~nx1"
      "%iview%" "%~1" /info="%TMP%\%nfofile%"
      for /f "tokens=4,6 delims= " %%a in ('find "dimensions" "%TMP%\%nfofile%"') do (
      set width=%%a
      set height=%%b
      )
      echo width : !width! Pixel
      set /a width1 = !width! * 71 / 100
      echo width1 : !width1! Pixel
      set /a height1 = !height!
      echo height1: !height1! Pixel

      IF "%height%" GTR "%width%" (
      echo height größer als width
      ) ELSE (
      echo height kleiner als width
      set /a x = !height1! * 80 / 79
      set /a x = !width1! - !x!
      set /a x = !x! / 2
      set /a width2 = !height1! * 80 /79
      set /a y = !height1!
      set /a height2 = !height1!
      )
      echo width2 : !width2! Pixel
      echo height2: !height2! Pixel
      echo x : !x! Pixel
      echo y : !y! Pixel
      "%iview%" "%~1" /resize=^(!width1!,!height1!^) /crop=^(!x!,!y!,!width2!,!height2!^) /resize=^(80,79^) /convert="$Dnew\$N_$Wx$H$O"

      )

      if exist "%TMP%\%nfofile%" del "%TMP%\%nfofile%"


      endlocal

      Comment


        #4
        Hallo,

        ich klinke mich da mal mit ein.
        Also, was möchtest du hier genau machen? Du verkleinerst eine Datei und beschneidest sie auch noch.
        Und am Ende soll ein Bild mit 80x79 Pixeln herauskommen.
        Weiterhin erlaubst du es, dass das Bild verzerrt wird.
        Und du unterscheidest, ob das Bild im Hoch- oder Querformat vorliegt.

        Zuerst einmal hast du hier schon recht viel gemacht.
        Deine Formeln muss ich mir nochmal genauer anschauen. ;-)

        Ich würde wegen der Problematik mit "setlocal enabledelayedexpansion" versuchen, auf die Berechnung innerhalb von if-Abfragen zu verzichten, ebenso mit der for-Schleife. Dazu gibt es zwei Möglichkeiten:
        a) call
        b) goto

        Mit "call" rufst du ein Skript auf und kannst dort gleich zu einer Sprungmarke springen. Dieses Skript beendet man i.d.R. "goto :eof" (eof: End Of File). Eine besondere MEthode bietet call, indem man den Skriptnamen wegläßt und gleich eine Sprungmarke angibt: "call :work %var%"
        Dadurch wird das eigene Skript nochmal neu geladen, nach ":work" gesprungen und %var% als Parameter übergeben. Da das Skript neu geladen wird, gibt es dort nun einen neuen Paramter "%1". Bei der for-Schleife hat dieser Aufruf den Charme, dass man auch mehrere Durchläufe recht elegant verarbeiten kann.

        b) mit goto kannst du innerhalb einer Datei hin und her springen, alle Variablen behalten hier ihre Gültigkeit.

        Code:
        @echo off
        cls
        setlocal enabledelayedexpansion
        
        :: --- Konfiguration --->
        
        :: Pfadangabe zu IrfanView
        set iview=C:\Program Files (x86)\IrfanView\i_view32.exe
        
        :: Bildinfo-Datei
        set nfofile="%TMP%\info.txt"
        
        :: <--- Konfiguration ---
        ::echo AAAAAAAAAAAAAAAAAAAAAAAAAAAA
        
        if "%~1"=="" (
         echo LEER
         echo Abbruch^^!
         echo Fehlender Parameter.
         pause
         goto ende
        )
        
        echo NICHT LEER
        echo Bildname: "%~nx1"
        "%iview%" "%~1" /info=%nfofile%
        for /f "tokens=4,6 delims= " %%a in ('find "dimensions" %nfofile%') do call :work %%a %%b
        
        goto ende
        
        :work
        set width=%%1
        set height=%%2
        
        echo width : %width% Pixel
        set /a width1 = %width% * 71 / 100
        echo width1 : %width1% Pixel
        set /a height1 = %height%
        echo height1: %height1% Pixel
        
        if "%height%" GTR "%width%" (
         echo height größer als width
         goto height
        ) else (
         echo height kleiner als width
         goto width
        )
        
        :height
        goto endwork
        
        :width
        set /a x = height1 * 80 / 79
        set /a x = width1 - x
        set /a x = x / 2
        set /a width2 = height1 * 80 /79
        set /a y = height1
        set /a height2 = height1
        
        echo width2 : %width2% Pixel
        echo height2: %height2% Pixel
        echo x : %x% Pixel
        echo y : %y% Pixel
        "%iview%" "%~1" /resize=^(%width1%,%height1%^) /crop=^(%x%,%y%,%width2%,%height2%^) /resize=^(80,79^) /convert="$Dnew\$N_$Wx$H$O"
        goto endwork
        
        :endwork
        goto :eof
        
        if exist %nfofile% del %nfofile%
        
        :ende
        endlocal
        Bei dem Aufruf zur Verkleinerung hast du zweimal den Befehl /resize verwendet. Ist das so gewollt? Oder ist es dass, was du mit dem temp. Namen zur weiteren Verarbeitung meinst?

        Du solltest bei solchen Aktionen darauf achten, wenn Du JPEG-Dateien verarbeitest, dass du bei jedem Speichern etwas Qualität verleirst (liegt leider am Dateiformat von JPEG).

        Viele Grüße
        Nils

        Comment


          #5
          Das zweite ”/resize” wird auch ignoriert, da 'IrfanView' eine solches Kommando nicht ausführen kann (s. IV-Befehlssyntax).

          Die Anforderung verlangt nach einem Zwischenschritt:

          Code:
          @echo off
          cls
          setlocal enabledelayedexpansion
          
          :: --- Konfiguration --->
          
          :: Pfadangabe zu IrfanView
          set iview=C:\Program Files (x86)\IrfanView\i_view32.exe
          
          :: Bildinfo-Datei
          set nfofile=info.txt
          
          :: <--- Konfiguration ---
           
          
          if "%~1"=="" (
             echo Abbruch^^!
             echo Fehlender Parameter.
          ) else (
             echo          Verarbeite Bild: "%~nx1"
             "%iview%" "%~1" /info="%TMP%\%nfofile%"
             for /f "tokens=4,6 delims= " %%a in ('find "dimensions" "%TMP%\%nfofile%"') do (
                set width=%%a
                set height=%%b
             )
             echo    Primary width ^(width^): !width! Pixel
             set /a width1=!width! * 71 / 100
             echo       New width ^(width1^): !width1! Pixel
             set /a height1=!height!
             echo Primary height ^(height1^): !height1! Pixel
          
             echo.
             if "%height%" gtr "%width%" (
                echo height größer als width
             ) else (
                echo height1 kleiner als width1
                set /a x=!height1! * 80 / 79
                set /a x=!width1! - !x!
                set /a x=!x! / 2
                set /a width2=!height1! * 80 /79
                set /a y=!height1!
                set /a height2=!height1!
                echo   width2: !width2! Pixel
                echo  height2: !height2! Pixel
             )
          
             echo.
             echo   width2: !width2! Pixel
             echo  height2: !height2! Pixel
             echo        x: !x! Pixel
             echo        y: !y! Pixel
          
             "%iview%" "%~1" /resize=^(!width1!,!height1!^) /crop=^(!x!,!y!,!width2!,!height2!^) /convert="!~dp1!~tmp.pcx"
             "%iview%" "%~dp1~tmp.pcx" /resize=^(80,79^) /convert="$Dnew\$N_$Wx$H$O"
          )
          if exist "%TMP%\%nfofile%" del "%TMP%\%nfofile%"
          if exist "%~dp1~tmp.pcx" del "%~dp1~tmp.pcx"
           
          
          endlocal

          Anmerkung: Und achte zukünftig sehr sorgfältig auf die Syntax des Befehls ”set”; bei nicht-arithmetischen Operationen sind

          set height1 = !height!
          und
          set height1 =!height!

          nämlich immer noch zwei Paar Schuhe.
          Last edited by Foxy; 27.01.2012, 06:43 PM.
          »Und so, in eurer Verzweiflung, kommt ihr zu mir.«

          Texteditor EmEditor:
          Deutsche Sprachdatei (v7.01) für EmEditor Pro 7.02 (englisch)
          EmEditor Pro 8.06 (deutsch) | Deutsche Sprachdatei (v8) für EmEditor Pro 8.06 (englisch)
          Deutsche Sprachdatei (v9.16) für EmEditor Pro 9.17 (englisch)

          Comment


            #6
            Echt spitze, vielen Dank. Ein Problem habe ich noch. Der File-Name im new Ordner ist nicht der Originalname.png sondern immer "~tmp_80x79.png". Wie kann ich den Originalnamen erhalten?

            Comment


              #7
              Mmh..., stimmt. Diese Zeile sollte Abhilfe schaffen:

              Code:
              "%iview%" "%~dp1~tmp.pcx" /resize=^(80,79^) /convert="$Dnew\%~n1_$Wx$H$O"
              »Und so, in eurer Verzweiflung, kommt ihr zu mir.«

              Texteditor EmEditor:
              Deutsche Sprachdatei (v7.01) für EmEditor Pro 7.02 (englisch)
              EmEditor Pro 8.06 (deutsch) | Deutsche Sprachdatei (v8) für EmEditor Pro 8.06 (englisch)
              Deutsche Sprachdatei (v9.16) für EmEditor Pro 9.17 (englisch)

              Comment


                #8
                Danke, das funktioniert!

                Comment


                  #9
                  /filepattern und Rahmen hinzufügen

                  Ich habe folgende Fragen zum /filepattern:
                  Wie kann ich die Liste mit jpg- und png-Bildern füllen?
                  Wie kann ich dann die Liste der Bilder auf Batchkommandos anwenden?

                  Ich kann ich ein Bild z. B. mit einer Größe von 450 x 650 zentriert in einen Rahmen von 650 x 650 kopieren. Der Rahmen sollte dabei noch transparent sein. Online machen ich das über einen "Farb-Rahmen hinzufügen (Canvas)...". Wie mache ich das im Batch?

                  PS: Hier ist die aktuelle Version vom Skript:
                  Code:
                  @echo off
                  cls
                  setlocal enabledelayedexpansion
                  
                  :: --- Konfiguration --->
                  
                  :: Pfadangabe zu IrfanView
                  set iview=C:\Program Files (x86)\IrfanView\i_view32.exe
                  
                  :: Bildinfo-Datei
                  set nfofile=info.txt
                  
                  :: <--- Konfiguration ---
                  ::echo AAAAAAAAAAAAAAAAAAAAAAAAAAAA
                  
                  if exist "%~1" (
                     echo  Bildname: "%~nx1"
                  ) else (
                     echo Bild "%~nx1" nicht vorhanden
                     goto end
                  )
                  
                  
                  if "%~1"=="" (
                     echo LEER
                     echo Abbruch^^!
                     echo Fehlender Parameter.
                  ) else (
                  rem   echo NICHT LEER
                     "%iview%" "%~1" /info="%TMP%\%nfofile%"
                     for /f "tokens=4,6 delims= " %%a in ('find "dimensions" "%TMP%\%nfofile%"') do (
                        set width=%%a
                        set height=%%b
                     )
                  
                     set /a width1=!width!
                     set /a height1=!height! * 100 / 71
                  
                  
                     IF !height1! GTR !width1! (
                  
                       echo height2 größer als width2
                       set /a width2=!width1!
                       set /a height2=!width2! * 80 /79
                       set /a x=0
                       set /a y=!height1! - !height2!
                       set /a y=!y! / 2
                  
                  
                     ) ELSE (
                  
                       echo width2 größer als height2
                       set /a width2=!height1!
                       set /a height2=!height1! * 80 /79
                       set /a Y=0
                       set /a X=!width1! - !width2!
                       set /a X=!X! / 2
                  
                     )
                     echo    width : !width! Pixel
                     echo    height: !height! Pixel
                     echo   width1 : !width1! Pixel
                     echo   height1: !height1! Pixel
                     echo   width2 : !width2! Pixel
                     echo   height2: !height2! Pixel
                     echo        x : !x! Pixel
                     echo        y : !y! Pixel
                     "%iview%" "%~1" /resize=^(!width1!,!height1!^) /convert="C:\windows batch\new\A_1.png"
                     "%iview%" "C:\windows batch\new\A_1.png" /crop=^(!x!,!y!,!width2!,!height2!^) /convert="C:\windows batch\new\A_2.png"
                     "%iview%" "C:\windows batch\new\A_2.png" /resize=^(80,79^) /convert="$D%~n1_$Wx$H.png"
                  rem   "%iview%" "%~1" /resize=^(!width1!,!height1!^) /crop=^(!x!,!y!,!width2!,!height2!^) /convert="!~dp1!~tmp.pcx"
                  rem   "%iview%" "%~dp1~tmp.pcx" /resize=^(80,79^) /convert="$Dnew\%~n1_$Wx$H.png"
                  )
                  
                  if exist "%TMP%\%nfofile%" del "%TMP%\%nfofile%"
                  if exist "%~dp1~tmp.pcx" del "%~dp1~tmp.pcx"
                  
                  :end
                  
                  endlocal

                  Comment

                  Working...
                  X