PDA

View Full Version : Per Skript konvertieren und in gleiche Verzeichnisstruktur kopieren



mogli
11.08.2008, 02:09 PM
Hallo,

normalerweise arbeite ich unter Linux, aber wenn unter Windows, dann sehr gerne mit irfanview.
Jetzt stehe ich aber vor einem Problem, was ich so nicht direkt im Forum entdecken konnte. Ich möchte vom Quellverzeichnis, die beinhalteten jpg-Dateien in ein Verzeichnis auf einem anderen Datenträger in die gleiche Bilderverzeichnisstruktur kopieren und konvertieren und in einer zweiten Runde auch umbenennen.

Jetzt kam ich anfangs auf folgende Idee für eine Batchdatei.



set iview=%ProgramFiles%\IrfanView\i_view32.exe
set PfadQuelle=E:\quellverzeichnis\bilder
set PfadZiel=G:\zielverzeichnis\bilder

set resize_gross=/resize_long=450 /aspectratio /jpgq=85 /ini="E:\f\iview\gross\"
set resize_klein=/resize_long=180 /aspectratio /jpgq=85 /ini="E:\f\iview\klein\"

xcopy %PfadQuelle% %PfadZiel%\ /T /E

%iview% "%PfadQuelle%\*.jpg" %resize_gross% /convert=%PfadZiel%\$d\$N.jpg

%iview% "%PfadQuelle%\*.jpg" %resize_klein% /convert=%PfadZiel%\$d\$N_vorschau.jpg


Mit xcopy habe ich erstmal die Verzeichnisstruktur am Ziel identisch angelegt, wie auch bei der Quelle

resize_gross/klein denke ich ist klar, das ganze soll dann jedes Bild auf die längste Seite 450, bzw. 180 setzen, in der ini-Datei steht dann noch, das kleine Bilder nicht vergrößert werden sollen.

Dir Angabe mit dem $d als Verzeichnis, funktioniert aber nicht so, wie ich mir das vorstelle, es geht nur ein Verzeichnis tief und dadrunter tummeln sich dann alle Bilder, unabhängig, ob sie aus einem noch tieferen Verzeichnis stammen.
Dadurch, dass das ganze direkt im irfanview klappt, hab ich in der ini noch das Anlegen der Unterverzeichnisse mit angegeben, aber das ist denke ich mal komplett was anderes, zumindest gehts damit auch nciht.

Hat jemand eine Idee, für mein vorhaben?
vielen Dank im voraus
mogli

Foxy
11.08.2008, 04:22 PM
Momentan wüßte ich nicht, wie man 'IrfanView' auf Kommandozeile dazu bewegen könnte, auch Unterverzeichnisse in die Bearbeitung zu inkludieren. Fehlt’s da, läßt man mal ”/ini” außen vor, nicht an adäquaten Parametern?

Wenn die Verzeichnisstruktur aber so oder so schon im voraus per ”xcopy” auf dem Ziellaufwerk repliziert wird, dann ist der Rest mittels eines Schleifenkonstruktes (”for”) realisierbar.

Beispielgebender Ideenspender
(Pfad- wie Parameterangaben sind den Erfordernissen anzupassen):

for /r %%a in (*.jpg) do c:\irfanview\i_view32.exe %%a /resize=(200,0) /aspectratio /resample /convert=%%a

mogli
11.08.2008, 06:49 PM
Hallo foxy,

vielen Dank für die schnelle Antwort.
Die for-Schleife hatte ich auch schon mal am Wickel, aber ich hab da irgendwo noch ne kleine Denkblockade.
Denn, ähnlich wie bei den anderen Ideen, habe ich das Problem, das der ganze Pfad übergeben wird, weshalb dann iview natürlich meckert. Oder aber, ich gehe das mit der Schleife ganz falsch an.



for /r %PfadQuelle% %%a in (*.jpg) do %iview% %%a %resize_gross% /convert=%PfadZiel%\%%a


Hast Du da noch eine Idee, wie man das lösen kann?
Grüße und danke im voraus
mogli

Foxy
11.08.2008, 07:33 PM
Wandle:
”for /r %PfadQuelle% %%a in (*.jpg) do %iview% %%a %resize_gross% /convert=%PfadZiel%\%%a”

zu:
”for /r %PfadQuelle% %%a in (*.jpg) do %iview% %%a %resize_gross% /convert=%%a”

; dann funktioniert’s auch mit Pfadangabe in der ”for”-Schleife.

mogli
11.08.2008, 08:36 PM
Aber in dem %%a steckt doch der Dateiname plus kompletten Pfad drin, so konvertiere ich ja dann einfach an der Quelle ohne kopieren.
Mit dem xcopy /T /E kopiere ich ja nur den Verzeichnisbaum, nicht die Dateien, weil ich dachte es wäre irgendwie einfacher, mit i_view die Dateien in ein bestehendes Verzeichnis zu konvertieren und kopieren, da ich vorher auch schon mal in der ähnlichen Sackgasse steckte.

Hintergrund war eigentlich nur der, dass das Quellverzeichnis unangetastet bleiben soll.
Ich könnte zwar auch vorher eine komplette Kopie des Verzeichnisses machen, aber das wollte ich erstmal vermeiden, da das VVerzeichnis ca. 7 GB an jpgs beinhaltet.

Aber dann gehts wahrscheinlich doch nicht so ohne weiteres, dann werde ich wahrscheinlich doch erstmal bei der grafischen variante bleiben.

Vielen Dank nochmal für die Hilfe
Rainer

Foxy
11.08.2008, 11:29 PM
Ach so, verstehe. Die Verzeichnishierarchie alleine wird dupliziert. Ich ging, fälschlicherweise, von anderen Voraussetzungen aus.

Dann hätte ich dies zu offerieren (das anfängliche ”xcopy” wird dabei auch gleich obsolet):

@echo off
cls

set source=h:\quelle
set target=h:\ziel

for /r %source% %%I in (*.jpg) do (
if not exist %target%%%~pI md %target%%%~pI
e:\irfanview\i_view32.exe %%I /resize_long=200,0 /aspectratio /resample /convert=%target%%%~pnxI
)

set source=
set target=

Aber nichts ohne Tadel, besser gesagt Schönheitsfehler. Es wird unterhalb des ”Ziels” die komplette Verzeichnisstruktur der ”Quelle” reproduziert. Im Endeffekt entsteht also eine Ebene mehr als notwendig. Dieses Manko könnte im nachhinein durch einen steuernden Eingriff per Batch korrigiert werden, indem die Verzeichnisstruktur eine Ebene nach oben verschoben und das dadurch geleerte Verzeichnis gelöscht wird.

Insgesamt nicht unbedingt der eleganteste Weg, aber derzeit der einzigste, der mir machbar ist.

mogli
12.08.2008, 02:00 PM
Danke für den Tip, hab darauf aufbauend noch etwas weiter getestet und folgendes gemacht. Funktioniert soweit genau, wie ich es haben will, ohne den kompletten Pfad nochmal zu erstellen. Musste dafür nur noch zusätzlich die setlocal enableddelayedexpansion mit angeben.



for /r %PfadQuelle% %%I in (*.jpg) do (
set ziel2=%%~pnxI
set ziel3=!ziel2:~52,250!
%iview% %%I %resize_gross% /ini="%inipfad%" /convert=%PfadZiel%\!ziel3!
)


Hab dafür aber den xcopy Befehl wieder reingenommen, da ich nicht wusste, wie ich aus meinen Variablen die Unterverzeichnisse rausbekommen soll.
Bei Ziel3 hab ich den Pfadnamen auseinander genommen, denn genau ab der 53. Stelle beginnen die Dateinamen + ggf. Verzeichnisnamen. Ab da an wirds dann unterhalb vom Zielverzeichnis gleich der Quelle.

Jetzt hab ich nur noch ein kleines Problem, ich möchte am Ziel zwei Dateien haben, einmal mit der größten Seite 450, einmal mit der größten Seite 180, was jedes mal aus der ini-Datei mit übergeben werden soll. Die kleine Datei soll dann im Namen noch ein "vorschau" tragen.

Also nach dem Schema


%iview% %%I %resize_gross% /ini="%inipfad%" /convert=%PfadZiel%\$N_vorschau.jpg


Mein Problem ist jetzt nur, wie bekomme ich das aktuelle Unterverzeichnis raus, welches ich dann benutzen kann, um die umbenannte Datei richtig zu platzieren?
Hast Du da noch eine Idee?

Foxy
12.08.2008, 04:43 PM
Von der ”Quelle” als Ausgangspunkt betrachtet: Dasselbe in grün wie bei ersten Mal, mit dem einzigen Unterschied, daß der Dateiname um ”_Vorschau” erweitert wird. Im Endeffekt also zwei Durchläufe: der erste fürs „große Bild“, der zweite fürs „kleine Bild“.


Vom ”Ziel” als Ausgangspunkt betrachtet: Die bereits kopierten Bilder erneut bearbeiten, um aus ihnen zusätzlich Vorschaubilder zu generieren.

”for /r %target% %%I in (*.jpg) do %iview% %%I %resize_klein% /convert=%%~dpnI_vorschau%%~xI”

Der Zielpfad ist bekannt, alle anderen Pfadangaben brauchen nicht erst umständlich ermittelt zu werden, da die ”for”-Schleife diese Arbeit von ganz alleine übernimmt, setzt man sie nur an das richtige Verzeichnis an.


Oder verstehe ich wieder etwas falsch?

mogli
12.08.2008, 05:34 PM
Stimmt, dann mache ich das gleich so und kopiere anschließend höchstens noch den Verzeichnisbaum um, falls mich der Rattenschwanz stören sollte.
Dann hab ichs eigentlich soweit zusammen, wie ichs mir vorgestellt habe.

Vielen Dank für die unermüdliche Hilfe
Grüße
rainer