Problem mit Exiftool bei Skriptaufruf

Birdman

Mitglied
Registriert
10.10.06
Beiträge
126
Ort
Unterhaching
Hallo zusammen,

ich arbeite seit einiger Zeit mit der Windows-Standalone Version von Exiftool und habe mir da ein kleines Windows Befehlskript (.cmd) zum Umsetzen der Objektivdaten in den Benutzerkommentar gebastelt. Dies funktioniert auch problemlos.

Nun wollte ich mal den Aufruf dieses Skriptes aus einem FF-Skript probieren und scheitere schon ganz am Anfang. Als Basis hab ich das Paint-Beispielskript modifiziert und wollte so die CMD-Datei ansprechen. Aber egal wie ich es anstelle, die CMD-Datei wird zwar anscheinend angesprochen, aber nicht ausgeführt. Dies scheint aber allein am Exiftool-Inhalt zu liegen, lasse ich mit der CMD-Datei ein x-beliebiges Programm aufrufen oder sonst etwas ausführen, dann klappt das. Irgendwie seh ich den Wald vor lauter Bäumen wohl nicht.

Viele Grüße,
Birdman
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Birdman,

warum sprichst Du Exiftool nicht direkt aus dem Skript an? Dazu ist keine *.cmd nötig.
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Birdman,

warum sprichst Du Exiftool nicht direkt aus dem Skript an? Dazu ist keine *.cmd nötig.
Hallo Werner,

ich weiss, aber nachdem die Direktansprache nicht funktionierte, wollte ich erstmal sichergehen, dass ich nicht irgendwelche Syntaxfehler bei der Exiftool-Ansprache eingebaut habe. Dann wollte ich mich weitertasten. Der Exiftool-Befehl für die Windows-Version lautet übrigens:
exiftool "-LensType>UserComment" -overwrite_original *.jpg
Alle meine Versuche dies direkt in FF umzusetzen schlugen bisher leider fehl.

Aber wieso kann eine cmd.Datei gleichen Namens, im selben Pfad nur mit anderem Inhalt (= Nicht Exiftool) ausgeführt werden und beim Exiftool-Inhalt wird es ignoriert? Vielmehr geht ein CMD-Fenster auf, aber nichts tut sich.

Hallo Walter,
den Thread hatte ich gesehen. Da mir aber die Skriptgrundlagen fehlen, war mir der Exiftool-Befehl etwas zu sehr eingebaut, um dieses Skript zu modifizieren. Außerdem wäre mir VBS auch lieber, da ich das dann in ein bestehendes Skript einbauen könnte.

Viele Grüße,
Birdman
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Birdman,

wie rufst Du denn auf: Mit oWSHShell.Run oder mit oWSHShell.Exec?
Exec hat bei Commandozeilen-Tools den Vorteil, dass man Ein-/Ausgabe steuern kann. Du kannst die Ausgabe z. B. direkt in das Skript einlesen. Beispiele dafür gibt es in der WSH-Hilfe.

Erzeugen von oWSHShell unter VBScript:
Dim oWSHShell
Set oWSHShell = CreateObject("Shell.Application")
Erzeugen von oWSHShell unter JScript:
var oWSHShell = new ActiveXObject("Shell.Application");


Könnte sein, dass die Kommandozeilenübergabe, die per Minus "-" eingeleitet wird, zu Problemen führt. Auch bei doppelten Anführungszeichen muss man aufpassen. Spiele mal ein wenig mit den Anführungszeichen. Innerhalb einer Zeichenkette müssen Anführungszeichen gedoppelt werden. Auch wird in FF ein anderer Basispfad angenommen als unter Windows-Ebene. Hier sollte immer mit absoluten Pfaden gearbeitet werden.
Beispiel VBScript:
oWSHShell.Run "exiftool ""-LensType>UserComment"" -overwrite_original ""X:\Voller Pfad\*.jpg"""
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Werner,

Danke für den entscheidenden Tipp. Mit etwas Modifikation funktioniert die Ansprache von Exiftool per Skript nun weitgehend:

Code:
Dim Pfad, JPG, oWSHShell

'Alle JPG-Dateien im selektierten Pfad mit Exiftool aendern:
'LensType nach UserComment kopieren
	
	Pfad = FF_GetImagePath
	JPG = Pfad & "\*.jpg"	
	Set oWSHShell = CreateObject("WScript.Shell")
	oWSHShell.Exec "C:\Programme\Exiftool\exiftool ""-LensType>UserComment"" -overwrite_original """ & JPG
    FF_Sleep(3500)

Womit ich noch nicht ganz glücklich bin, ist der FF_Sleep-Befehl. Da ich nach der Exiftool-Umsetzung im selben Skript die teilweise kryptischen Objektivbezeichnungen im UserComment in Klartext umwandle, startet bei sehr vielen Dateien diese Umwandlung bereits, bevor Exiftool ganz fertig ist. Dann werden die ersten Dateien in der Schlange nicht berücksichtigt.

Ich könnte natürlich eine sehr lange FF-Wartezeit vorgeben, aber bei nur wenigen Dateien wäre das ja über das Ziel hinaus geschossen. Gibt es eine Möglichkeit in VBS, die nächsten Schritte genau dann zu starten, wenn die vorherigen abgeschlossen sind?

Viele Grüße
Birdman
 
AW: Problem mit Exiftool bei Skriptaufruf

Gibt es eine Möglichkeit in VBS, die nächsten Schritte genau dann zu starten, wenn die vorherigen abgeschlossen sind?
Function Run(byVal Cmd as String, [WindowStyle],[WaitOnReturn])
set shell=CreateObject("Wscript.Shell")
x = shell.run("exiftool.exe"&"beliebige Parameter"),,True

- Funktioniert nur, wenn run als Funktionsaufruf gestartet wird, der Ergebniscode ist unerheblich.
- wenn unsicher, den gesamten run-Klammerausdruck als String montieren und mit MsgBox testen.
- wenn Probleme mit geschachtelten Anführungszeichen, stattdessen Chr(34) benutzen.
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Jochen,

Danke für den Hinweis. Hab mal ein wenig rumprobiert, funktioniert leider nicht so ganz bei mir. Was ich nicht verstehe, ist das "x = ". Ohne diesen Zusatz wird zwar Exiftool angestossen, aber anscheinend wartet FF nicht auf das Ende.
Gruß,
Birdman
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Jochen,

Danke für den Hinweis. Hab mal ein wenig rumprobiert, funktioniert leider nicht so ganz bei mir. Was ich nicht verstehe, ist das "x = ". Ohne diesen Zusatz wird zwar Exiftool angestossen, aber anscheinend wartet FF nicht auf das Ende.
Gruß,
Birdman
Richtig. Es funktioniert nur als Funktionsaufruf.
Dies sollte 5 x nacheinander ExifTool aufrufen. x enthält nach jedem Aufruf den Exitcode von ExifTool. Der interessiert Dich ja wohl nicht, also gar nicht drum kümmern.

Set shell=CreateObject("Wscript.Shell")
For i = 1 to 5
x = shell.run("ExifTool.exe",,True)
Next
Set shell = Nothing
 
AW: Problem mit Exiftool bei Skriptaufruf

Richtig. Es funktioniert nur als Funktionsaufruf.
Dies sollte 5 x nacheinander ExifTool aufrufen. x enthält nach jedem Aufruf den Exitcode von ExifTool.
Hallo Jochen,

Danke erstmal für Deine Mühe.

Wieso sollte ich denn 5mal Exiftool aufrufen? Ich brauche die dortige Funktion ja nur einmal. Mein Problem ist ja, dass ich eine Wartezeit brauche (oder Exiftool wirklich fertig ist), bevor das FF-Skript weitermacht. Bei dem von Dir geschriebenen Code passiert nach dem Exiftool-Aufruf nämlich gar nichts mehr.

Gruß,
Birdman
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Jochen,

Danke erstmal für Deine Mühe.

Wieso sollte ich denn 5mal Exiftool aufrufen? Ich brauche die dortige Funktion ja nur einmal. Mein Problem ist ja, dass ich eine Wartezeit brauche (oder Exiftool wirklich fertig ist), bevor das FF-Skript weitermacht. Bei dem von Dir geschriebenen Code passiert nach dem Exiftool-Aufruf nämlich gar nichts mehr.

Gruß,
Birdman
Grundgütiger. Das war doch nur als Theorie und Nachhilfe für Dein Verständnis darüber gedacht, was "X", Funktionsaufruf und sequentielle Abarbeitung von Jobs miteinander zu tun haben. Ich will Dir ja nicht zu nahe treten, aber es könnte sicher nichts schaden, sich wenigstens rudimentäre Grundkenntnisse anzueignen.
 
AW: Problem mit Exiftool bei Skriptaufruf

Ich will Dir ja nicht zu nahe treten, aber es könnte sicher nichts schaden, sich wenigstens rudimentäre Grundkenntnisse anzueignen.
Tust Du sicher nicht, das ist mir schon klar. ;) Ich praktiziere mehr das Learning-by-doing, sprich ich schaue mir vorhandene Skripte an und versuche diese nach meinen Bedürfnissen anzupassen. So lerne ich dann (hoffentlich) auch was dabei. Wie zum Beispiel jetzt gerade: da hab ich endlich das Skript so wie ich es gerne hätte und stelle nach diversen Testläufen in einem Testpfad fest, dass Exiftool nicht so ohne weiteres mit den Windows-Pfaden wie "Eigene Dateien" umgehen kann. Na, dann werde ich wohl mal weitersuchen. ;)

Trotzdem nochmal Danke für Deine Geduld!
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Birdman,

beim Run-Befehl kannst Du, wie es Jochen in seinem Beispiel tat, angeben, dass das Skript solange warten soll, bis Exiftool fertig ist. Da braucht's kein FF_Sleep. Nur nochmal des Verständnisses wegen.
Exec ist ein bischen komplizierter. Hier muss der Rückgabewert ausgewertet werden, um dann aus einer Schleife auszubrechen. Innerhalb dieser Schleife kann man jedoch die Bildschirmausgabe auffangen. Ist aber ein bischen kompliziert für einen Anfänger.
Wenn Du diese Spezialfunktionen für Consolen-Fenster nicht brauchst, bleib bei der HiLevel-Funktion WSHShell.Run. Näheres zur Anwendung in der deutschen Hilfe des WSH.
 
AW: Problem mit Exiftool bei Skriptaufruf

Hallo Jochen und Werner,

vielen Dank nochmal für Eure Hilfe, mittlerweile habe ich mit Euren Anregungen das Skript zum Laufen gebracht. Vielleicht interessiert es ja den Ein oder Anderen:
Code:
'Autor: Birdman, www.MMBici.de
'FFSubmenu=Exif
'FFName=Exiftool

Dim Pfad, JPG, shell, x
Dim Anzahl, Datei, Objektiv, Kamera, Datum, IAut, i
i = 0

'##########################################################
'T E I L  1
'EXIF-Information aller JPG-Dateien im selektierten Pfad mit Exiftool modifizieren:
'LensType nach UserComment kopieren
'ACHTUNG: Es werden ALLE JPG-Dateien im Pfad geaendert, nicht nur die mit FF selektierten!

Pfad = FF_GetImagePath
JPG = Pfad & "\*.jpg"	
Set shell=CreateObject("Wscript.Shell")

'1. Zwischen den ersten beiden " den Pfad und Name der Windows-Standalone-Version
'   von Exiftool eintragen sowie ein Leerzeichen am Ende
'2. Zwischen dem dritten und vierten " kommt die Exiftool-Anweisung
'   ohne die für Windows erforderlichen Anführungszeichen (werden durch Chr(34) eingefügt)
'3. Zwischen dem fünften und sechsten " kommt die Exiftool-Anweisung, die Originaldatei zu
'   überschreiben, dies kann bei Bedarf entfallen 
x = shell.run("C:\Programme\Exiftool\exiftool " & Chr(34) & "-LensType>UserComment" & Chr(34) & " -overwrite_original " & Chr(34) & JPG & Chr(34),,True)


'##########################################################
'T E I L  2
'Bei allen selektierten Fotos die originale Objektivbezeichnung des Herstellers umaendern.
'Bei nicht vorgegebenen Kameratypen (hier: nicht K100D) wird die Kamerabezeichnung in den UserComment übertragen.
'Kameraabhängiger Eintrag des Fotografen

Anzahl = ff_GetImageCount
while i < Anzahl
	Datei = FF_GetImageName(i)

	FF_SetProgressText i, Anzahl-1, Datei

	If FF_LoadExif(Datei) Then
	 	If FF_HasExif Then
	 		Objektiv = FF_GetExifTag("UserComment")
	 		Kamera = FF_GetExifTag("Model")
	 		Datum = FF_GetExifTag("DateTimeOriginal")

	            If Kamera = "PENTAX K100D       " then 
					If Objektiv = "smc PENTAX-DA 10-17mm F3.5-4.5 ED [IF] Fisheye zoom" then FF_SetExifTag("UserComment"), "K100D mit Pentax DA 10-17mm"
					If Objektiv = "smc PENTAX-DA 12-24mm F4 ED AL [IF]" then FF_SetExifTag("UserComment"), "K100D mit Pentax DA 12-24mm"
					If Objektiv = "TAMRON XR DiII 18-200mm F3.5-6.3 (A14)" then FF_SetExifTag("UserComment"), "K100D mit Tamron 18-200mm"
					If Objektiv = "Unknown (7 238)" then FF_SetExifTag("UserComment"), "K100D mit Tamron 18-250mm"
					If Objektiv = "TAMRON SP AF 90mm F2.8 (172E)" then FF_SetExifTag("UserComment"), "K100D mit Tamron 90mm Makro"
					If Objektiv = "smc PENTAX-FA 50mm F1.7" then FF_SetExifTag("UserComment"), "K100D mit Pentax FA 50mm F1.7"
					If Objektiv = "smc PENTAX-FA 35mm F2 AL" then FF_SetExifTag("UserComment"), "K100D mit Pentax FA 35mm F2"
					If Objektiv = "smc PENTAX-DA 18-55mm F3.5-5.6 AL" then FF_SetExifTag("UserComment"), "K100D mit Pentax DA 18-55mm"
				else FF_SetExifTag("UserComment"), Kamera
				end if
				end if
			end if    
	If Kamera = "DMC-FX30" then FF_SetExifTag("UserComment"), "Panasonic FX 30"						
	If Kamera = "Canon PowerShot A430" then FF_SetExifTag("Artist"), "Fotograf 1"
	If Kamera = "PENTAX K100D       " then FF_SetExifTag("Artist"), "Fotograf 2"
	If Kamera = "DMC-FX30" then FF_SetExifTag("Artist"), "Fotograf 3"
	If Kamera = "Canon PowerShot S30" then FF_SetExifTag("Artist"), "Fotograf 1"
	FF_SaveExif Datei
	i=i+1
wend
Für Exiftool (Windows-Version) relevant ist nur Teil 1, mit Teil 2 baue ich mir die Objektivbezeichnungen nach meinen Wünschen um, um sie mit XnView übersichtlicher darstellen zu können.

Viele Grüße
Birdman
 
AW: Problem mit Exiftool bei Skriptaufruf

mittlerweile habe ich mit Euren Anregungen das Skript zum Laufen gebracht. Vielleicht interessiert es ja den Ein oder Anderen:
Na siehste. Ging ja doch.
Ich praktiziere mehr das Learning-by-doing, sprich ich schaue mir vorhandene Skripte an und versuche diese nach meinen Bedürfnissen anzupassen
Eine gute Methode, eigentlich sogar besser als jedes Lehrbuch, wenn man erstklassiges Anschauungsmaterial hat. Damit hast Du allerdings nicht so 100%-iges Glück gehabt.
 
Zurück
Oben