Teile eines Dateinamens an Variablen übergeben

Aktuelle Version: 12.10 (06.10.2018)
Alles zum Thema Directory Opus
Benutzeravatar
Berndi
Beiträge: 58
Registriert: 22. Mär 2009 11:50
Betriebssystem: Windows 10 Home 64bit
Produkt: DOpus x64 (aktuelle Version)
Version DOpus: Pro

Teile eines Dateinamens an Variablen übergeben

Beitrag von Berndi » 1. Aug 2018 11:21

Hallo Gemeinde,

Ich stehe mal wieder auf dem Schlauch. :(

Ich möchte den Dateinamen (Muster: "2018-08-01 - 11.21.00.JPG") innerhalb eines Befahls so zerlegen, dass ich das Datum und die Uhrzeit in separate Varieblen überführe, mit denen ich dann weiterarbeiten kann.


Wie muss ich das machen?

Danke schonmal für die Hilfe
Berndi

Benutzeravatar
tbone
Berater
Beiträge: 478
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von tbone » 1. Aug 2018 12:20

Das geht m.M. nur mit Scripting.
Du könntest die Datumsteile in VBScript z.B. mit der Mid("mystring", ..) Funktion herausschneiden, in JScript wäre es "mystring".substr(..).
Dein Befehl/Button muss dazu vom Typ Script sein oder werden. JScript zumindest hat auch einen Datums-Parser, der könnte das Datum u.U. auch selber aus dem jeweiligen String herauslesen. Damit erhälst Du dann aber ein Datums-Objekt, keine einzelnen Variablen mit getrennten Tag/Monat etc. Werten (obwohl diese Werte natürlich auch separat vom Objekt geholt werden können). Ein Datumsobjekt ist in der Regel flexibler, aber u.U. nicht einfacher anzuwenden, aber damit kann man dann z.B. auch rechnen.. 5 Tage addieren z.B., das geht mit separaten Variablen nicht, bzw. macht keinen Sinn, wenn man es korrekt haben möchte.

Es kommt jetzt auf Deinen gewünschten Einsatz an was man nimmt, und was man vll besser nicht nimmt. o)

Benutzeravatar
Berndi
Beiträge: 58
Registriert: 22. Mär 2009 11:50
Betriebssystem: Windows 10 Home 64bit
Produkt: DOpus x64 (aktuelle Version)
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von Berndi » 1. Aug 2018 12:29

Eigentlich möchte ich lediglich den Zeitstempel des Dateinamens im genannten Format mit dem EXIFTool als EXIF-Datum schreiben.

Benutzeravatar
tbone
Berater
Beiträge: 478
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von tbone » 1. Aug 2018 13:10

"lediglich" ist gut! o)

Hast Du das Datum nicht zufällig noch im Filesystem? Also passt vll das Datei-Erstellt/Modifiziert-Datum auch? Das wäre einfacher.

Wenn ExifTool den vollen Dateinamen ohne Extension, also "2018-08-01 - 11.21.00" als Datum frisst, dann wäre das auch einfach, hast Du das schonmal probiert? Oder weißt Du bereits, dass Du das Datum neu zusammenbauen musst, damit ExifTool es anerkennt und schreiben kann? Hat ExifTool vielleicht eine clevere Kommandozeilen-Option mit der man das Muster des Datums übergeben kann?

Ansonsten hilft wirklich nur mittels Scripting die Datumsteile separat herauslösen, neu zusammenbauen und dann in einem Format an ExifTool übergeben, welches "offiziell" ist. DO kann auch das Datum setzen, da bräuchte man jetzt nicht zwingend ExifTool, aber DO hat Schwierigkeiten mit RAW-Files in dieser Hinsicht, wenn Du auch RAW Files behandeln willst, dann doch lieber ExifTool.

Benutzeravatar
Berndi
Beiträge: 58
Registriert: 22. Mär 2009 11:50
Betriebssystem: Windows 10 Home 64bit
Produkt: DOpus x64 (aktuelle Version)
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von Berndi » 1. Aug 2018 13:45

Das ist ja das Problem.
In der Datei ist werde ein EXIF-Datum vorhanden, noch ist das Erstellt-Datum in irgendeiner Weise brauchbar.
Ich habe bereits einen Befehl zum Erstellen eines EXIF-Datums durch Eingabe von Datum und Uhrzeit

Code: Alles auswählen

@filesonly 
@codepage 

@set Datum_neu = {Rs|Datum eingeben (JJJJ:MM:TT)}
@set Zeit_neu = {Rs|Zeit eingeben (hh:mm:ss)}
@set string = {$Datum_neu} {$Zeit_neu}

C:\Windows\exiftool.exe -createdate="{$string}" {filepath} 
C:\Windows\exiftool.exe -datetimeoriginal="{$string}" {filepath} 
Doch ist das nur bei Einzeldateien praktikabel.

Jetzt verfüge ich über hunderte von Bildern im genannten Dateinamensformat und dachte mir, dass man die Dateinamensvariable doch relativ einfach, irgendwie zerlegen und wieder zusammenbauen könnte.

Leider fehlen mir die Skills. :-(

Benutzeravatar
Berndi
Beiträge: 58
Registriert: 22. Mär 2009 11:50
Betriebssystem: Windows 10 Home 64bit
Produkt: DOpus x64 (aktuelle Version)
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von Berndi » 1. Aug 2018 14:09

Wie übergebe ich denn den Dateinamen aus DOpus an die Funktion des VBScript im Befehl?

Habe mal eine Funktion in VBScript erstellt:

Code: Alles auswählen

script vbscript
Option Explicit

Function Name2EXIFDate(strFileName, strFilePath, fIsFolder, strOldName, ByRef strNewName)

	Dim strInfoArray
	Dim name
	Dim value
	Dim strDate
	Dim strTime
	Dim strDateTime
	Dim strCommand
	Dim x

	strInfoArray = split(strNewName, "  -  ")

	strNewName = ""
	strDate = ""
	strTime = ""

	if ubound(strInfoArray) > 0 then
		for x = lbound(strInfoArray) to ubound(strInfoArray)

			if len(strInfoArray(x)) = 10 then strDate = replace(strInfoArray(x),"-",":")
			if len(strInfoArray(x)) = 8 then strTime = replace(strInfoArray(x),".",":")
			msgbox (strDate & chr(13) & strTime)
		next
	end if
End Function

Benutzeravatar
tbone
Berater
Beiträge: 478
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von tbone » 1. Aug 2018 20:54

Versuch mal diesen Knopf..

Ich habe die moment.js Library von hier http://momentjs.com genommen (man muss das Rad ja nicht immer neu erfinden).
Die Library ist u.U. etwas overkill, aber damit geht dann wirklich alles, von Parsen über Formatieren und pipapo.
Dokumentation und Beispiele gibt es hier http://momentjs.com/docs

Ich habe alles in einen DO JScript-Knopf integriert und nun kannst Du oberhalb Deine Datumsmuster und Deinen ExifTool-Pfad eintragen.
Theoretisch sollte es dann schon gehen, also bei mir tut's! o)
DateFromFilenameToEXIF.dcf
(278.79 KiB) 9-mal heruntergeladen
.
Code nicht komplett, nur zur Anschauung..

Code: Alles auswählen

var srcDateTimePattern = "YYYY-MM-DD - HH.mm.ss"; //"2018-08-01 - 11.21.00";
var dstDateTimePattern = "YYYY:MM:DD HH:mm:ss";

var exifToolExePath = "/home\\tb_tools\\exiftool.exe";

function OnClick(data){
	var f=data.func, cmd=f.command, tab=f.sourcetab;
	var sfiles=tab.selected_files, names="", atts="";

	for(var i=0;i<tab.selected_files.count;i++){
		var fileDOItem = sfiles(i); //get selected DO item
		var fileName = fileDOItem.name; //get item name
		var fileDate = moment(fileName, srcDateTimePattern); //create moment date object from filename
		var dstDate = fileDate.format(dstDateTimePattern); //use moments format() method 
		DOpus.Output("File [" + fileName + "], date [" + dstDate + "]");
		var cmdLine = '"'+exifToolExePath+'" "-AllDates='+dstDate+'" "'+fileDOItem.realpath+'"'
		//DOpus.Output(cmdLine);
		cmd.RunCommand(cmdLine);
	}   

}

//##############################################################################
// http://momentjs.com -> http://momentjs.com/docs
// v2.22.2
//##############################################################################
//! moment.js
;(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    global.moment = factory()
}(this, (function () { 'use strict';

    var hookCallback;

    function hooks () {
        return hookCallback.apply(null, arguments);
    }
    
    //..

Benutzeravatar
Berndi
Beiträge: 58
Registriert: 22. Mär 2009 11:50
Betriebssystem: Windows 10 Home 64bit
Produkt: DOpus x64 (aktuelle Version)
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von Berndi » 1. Aug 2018 20:56

Gut, ich habe jetzt etwas herum gebastelt...

Folgenden VBA-Script-Code habe ich auf einen Knopf gelegt und er funktioniert so weit...

Code: Alles auswählen

Option Explicit
Function OnClick(ByRef ClickData)

Dim strFileName
Dim arrFileName
Dim strDate
Dim strTime
Dim strDateTime
Dim strCommand
Dim x

Dim Shell
Set Shell = CreateObject("WScript.Shell")

arrFileName = Array()

for each strFileName in ClickData.func.sourcetab.selected_files
	arrFileName = split(strFileName, "  -  ")

	if ubound(arrFileName) = 1 then

			strDate = replace(right(arrFileName(0),10),"-",":")
			strTime = replace(left(arrFileName(1),8),".",":")

	end if
	
	strDateTime =  strDate & " " & strTime

	strCommand = "C:\Windows\exiftool.exe -createdate=""" & strDateTime & """ """ & strFileName & """" 
	Shell.Run strCommand,6,True

	strCommand = "C:\Windows\exiftool.exe -datetimeoriginal=""" & strDateTime & """ """ & strFileName & """" 
	Shell.Run strCommand,6,True

next

End Function
Das Blöde ist nun aber, dass ich keinen Fortschrittsbalken habe.

Wie bekomme ich den DOpus-Fortschrittsdialog?

Gruß,
Berndi

Benutzeravatar
tbone
Berater
Beiträge: 478
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von tbone » 1. Aug 2018 21:03

EXIFTool kann das Datum in Dateinamen aber auch selbst parsen, hier ist ein Beispiel: http://u88.n24.queensu.ca/exiftool/foru ... pic=8456.0

Der Schalter oben hat nun aber den Vorteil, dass wir..
a) getestet und bewiesen haben, dass die moment.js Library auch unter DO geht..
b) wir leichter auf den internen SetMeta Befehl von DO umschalten können..
c) wir nun leicht auch irgendwas anderes mit Datumsen anstellen können..
d) und wir eine nettere Doku zu dem ganzen Datumsquatsch haben, als die von ExifTool. So toll das Tool ist, die Doku ist übel.. o)
e) ..

Benutzeravatar
tbone
Berater
Beiträge: 478
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von tbone » 1. Aug 2018 21:10

Oh, sehe Deine Antwort jetzt erst, hast es also auch selbst hingekriegt, sehr prima! o)

Was den Progress-Dialog angeht, hier ist die Doku dazu: https://www.gpsoft.com.au/help/opus12/i ... ogress.htm
Das geht zwar, aber aktuell habe ich dafür keine Zeit, dennoch ist eine Ausgabe in der ScriptKonsole vielleicht auch eine nette Alternative. Dazu brauchst Du ja bloss den aktuellen Index und die "insgesamt" Dateien ausgeben und hast dann auch eine Info zum Fortschritt. Ist sicher die arme Leute Methode, aber kostet jetzt keine 3 Stunden probieren! o)

Benutzeravatar
Berndi
Beiträge: 58
Registriert: 22. Mär 2009 11:50
Betriebssystem: Windows 10 Home 64bit
Produkt: DOpus x64 (aktuelle Version)
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von Berndi » 1. Aug 2018 23:27

Gibt es zu dem Progress-Dialog vielleicht irgendwo ein Code-Beispiel?
Vielleicht kann ich mir damit ja auch irgend etwas zusammenbasteln.


...und danke für die Hilfe und dein Mühe bis hierher. ;-)

Benutzeravatar
tbone
Berater
Beiträge: 478
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von tbone » 2. Aug 2018 00:08

Mhh, ja. Code Beispiele zum Progress-Dialog.. findest Du vermutlich im englischen Forum. Ich habe den Progress-Dialog selbst erst 1-2 Mal verwendet, ist schon länger her. Im "ScriptWizard" Script-Addin von mir ist einer drin, findest Du auch im englischen Forum, wäre aber nicht die beste Vorlage.

Benutzeravatar
Berndi
Beiträge: 58
Registriert: 22. Mär 2009 11:50
Betriebssystem: Windows 10 Home 64bit
Produkt: DOpus x64 (aktuelle Version)
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von Berndi » 2. Aug 2018 00:58

Ich finde leider nur Codeschnipsel in JScript, und da bin ich leider völlig unbeleckt.

Benutzeravatar
tbone
Berater
Beiträge: 478
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von tbone » 2. Aug 2018 02:14

JScript ist erstmal nicht sooo viel anders, bis man tiefer einsteigt und weitere Vorteile und Unterschiede sieht. Der "Umstieg" lohnt allemal! o)
Für JScript/Javascript gibt es so viel mehr Beispiele und Bibliotheken da draussen, allein deswegen, aber es programmiert sich auch besser! o)

Die JScript Beispiele sollten sich allerdings auch relativ einfach nach VBS übersetzen lassen.

Benutzeravatar
Berndi
Beiträge: 58
Registriert: 22. Mär 2009 11:50
Betriebssystem: Windows 10 Home 64bit
Produkt: DOpus x64 (aktuelle Version)
Version DOpus: Pro

Re: Teile eines Dateinamens an Variablen übergeben

Beitrag von Berndi » 2. Aug 2018 09:49

So, ich bin zu einem recht zufriedenstellenden Ergebnis gekommen.
Das Einzige, was ich allerdings noch nicht verstehe ist, warum der SKIP und ABORT-Button nicht erscheinen.
Auch würde ich gerne die DELETE-Zeile mit der DOpus-Funktion belegen...

Code: Alles auswählen

strCommand = "cmd /c del """ & strFileName & "_original"""
Irgendwelche Ideen?

Code: Alles auswählen

Option Explicit
Function OnClick(ByRef ClickData)

Dim strFileName
Dim arrFileName
Dim strDate
Dim strTime
Dim strDateTime
Dim strCommand
Dim x

dim DOpusRTPath
DOpusRTPath = "C:\Program Files\GPSoftware\Directory Opus\dopusrt.exe"

Dim Shell
Set Shell = CreateObject("WScript.Shell")

Dim Progress 
Set Progress = ClickData.func.command.progress
Progress.Init ClickData.func.sourcetab.lister, "Zeitstempel aus Dateiname zu EXIF-Meta"

With Progress
	.pause = false 
	.abort = true
	.skip = true 
	.owned = true
	.bytes = false
	.full = false
	.AddFiles ClickData.func.sourcetab.selected_files.count
End With

Progress.Show
Progress.SetStatus "Übertrage Zeitstempel..."

arrFileName = Array()

for each strFileName in ClickData.func.sourcetab.selected_files

	if Progress.GetAbortState = "a" then
		Progress.Hide
		WScript.Quit
	end if

	if Progress.GetAbortState = "s" then continue

	arrFileName = split(strFileName, "  -  ")

	if ubound(arrFileName) = 1 then
			strDate = replace(right(arrFileName(0),10),"-",":")
			strTime = replace(left(arrFileName(1),8),".",":")
	end if
	
    if len(strTime) < 8 then WScript.Quit 
	strDateTime =  strDate & " " & strTime

	Progress.SetName CStr(strFileName)
	Progress.Stepfiles 1

	strCommand = "C:\Windows\exiftool.exe -createdate=""" & strDateTime & """ """ & strFileName & """" 
	Shell.Run strCommand,0,True

    strCommand = "C:\Windows\exiftool.exe -datetimeoriginal=""" & strDateTime & """ """ & strFileName & """" 
	Shell.Run strCommand,0,True

	strCommand = """" & DOpusRTPath & """ /cmd SetAttr FILE=""" & strFileName & """ CREATED=""" & replace(strDate,":","-") & " " & strTime & """ MODIFIED=""" & replace(strDate,":","-") & " " & strTime & """"
	Shell.Run strCommand,0,true

	strCommand = "cmd /c del """ & strFileName & "_original"""
	Shell.Run strCommand,0,True

next

Progress.Hide

End Function
Gruß,
Berndi

Antworten