Änderungsdatum von Dateien aus deren Dateinamen setzen

  • VBScript

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Sachsenbauch.

    Änderungsdatum von Dateien aus deren Dateinamen setzen

    Hallo Gemeinschaft,
    in einem Ordner befinden sich Dateien, denen ein Datum (JJJJMMTT) zur besseren Sortierung vorangestellt ist. Durch ein Gleichheitszeichen wird dieser "Dateivorbau" vom übrigen Dateiname getrennt. Wenn ich das nachfolgende Script laufenlassen, werden zwar alle Dateien auf die gewünschten Datümmer eingestellt (also TT.MM.JJJ 19:00:00 - aber einige Dateien erhalten die Dateizeit 20:00:00, das Datum stimmt. Hier der Code

    Visual Basic-Quellcode

    1. Set objShell = CreateObject("Shell.Application")
    2. Set objFSO = CreateObject("Scripting.FileSystemObject")
    3. currentFolder = objFso.GetParentFolderName(WScript.ScriptFullName) ' akt. Ordner
    4. Set objFolder = objShell.NameSpace(currentFolder)
    5. Set colItems = objFolder.Items
    6. For Each objItem In colItems
    7. Set objFile = objFSO.GetFile(objItem.Path)
    8. If Instr(objFile,"=") Then
    9. ' Feld=split(objFile,"=")
    10. TT=mid(objItem,7,2)
    11. MM=mid(objItem,5,2)
    12. JJJJ=left(objItem,4)
    13. Datum=DateSerial(JJJJ,MM,TT)
    14. ' Msgbox objItem & ": " & Datum
    15. End if
    16. objItem.ModifyDate = DateValue(Datum) & " 19:00:00" ' TimeSerial(19,00,00)
    17. Next


    Könnte da so eine Art Sommer-/Winterzeit-Syndrom sein. d.h. wenn die Datei zur Winterzeit (also z.B. heute) erstellt wurde, wird auf 19:00 Uhr gewechselt. Ansonsten Sommerzeit - also eine Stunde später.
    Kann man das irgendwie umgehen, bei Umstellung auf Sommerzeit wird ja sowieso die Zeit der letzten Änderung um 1 Stunde erhöht.
    Winterliche Grüße ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sachsenbauch“ ()

    Das ist ein altes Problem. Die Zeit wird sich nach vergangenen Sekunden seit einem Fix-Datum, z.B. 01.01.1900 00:00:00 gemerkt. Die Sommerzeit gibt es erst seit 1980.?.
    Da könntest Du erst das alte Datum auf Sommer-/ Winterzeit analysieren und dann einen Offset berechnen.

    Quellcode

    1. debug.Print datediff("s","29.03.2015 01:59:59","29.03.2015 03:00:00")


    gibt 3601 statt 1 aus.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Danke,
    in Visual Basic gibt es wohl die TimeZoneInfo.IsDaylightSavingTime-Methode, da in VBS nicht implementiert ist.
    Nun gut, ich werde wohl damit leben müssen.

    Andererseits würde ich gerne das Datum der letzten Änderung (DateLastModified) auf das Erstellungsdatum einer Datei (DateCreated) übertragen. Das soll aber nicht gehen - ReadOnly.
    So muss man auf die vielen Tools zurückgreifen, die durch das Netz schweben...

    petaod schrieb:

    In VBS wird das schwierig.
    Falls VB.Net für dich eine Option ist, geht das

    Naja, VBS reicht für meine Bedürfnisse vollkommen aus. Ich möchte mich da nicht zu sehr "vertiefen". Dann nehmen wir eben die Tools... :D Dank U wel !
    VBS ist veraltet und wird von Microsoft bereits seit geraumer Zeit nicht mehr weiterentwickelt, was Grund genug sein sollte es für neue Projekte/Scripte nicht mehr einzusetzen.
    Wieso nutzt du nicht die PowerShell? Damit kannst du PowerShell-Scripte auf Basis des .NET Frameworks erstellen und somit Beispielsweise die von Sachsenbauch genannte Funktion einfach aufrufen, ohne gleich eine vollständige .NET Anwendung entwickeln zu müssen. Das wäre für diesen Anwendungsfall tatsächlich etwas overpowered und unflexibel.

    Sachsenbauch schrieb:


    Andererseits würde ich gerne das Datum der letzten Änderung (DateLastModified) auf das Erstellungsdatum einer Datei (DateCreated) übertragen. Das soll aber nicht gehen - ReadOnly.
    So muss man auf die vielen Tools zurückgreifen, die durch das Netz schweben...


    Wieso geht das nicht? Hast Du es probiert? Wenn ja, wie genau?

    Edit:

    Ah - OK. Habe mal eben meinen Code angesehen. Da wird nicht das FileSystemObject genutzt, sonder die API der kernel32.dll

    Quellcode

    1. Private Declare Function SetFileTime Lib "kernel32" ( _
    2. ByVal hFile As Long, _
    3. lpCreationTime As FileTime, _
    4. lpLastAccessTime As FileTime, _
    5. lpLastWriteTime As FileTime) As Long

    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „peterfido“ ()

    peterfido schrieb:

    Wieso geht das nicht? Hast Du es probiert? Wenn ja, wie genau?

    ...indem ich Dateien mit verschiedenen Erstellungsdatümmer aus Normal- und Sommerzeitmonaten verändert habe...
    Im übrigen dürfte Dein Quellcode für VBS nicht geeignet sein, denn VBS läßt keine Variablen mit assoziierten Datentypen zu.
    Ja, war gestern nicht mein Tag. Irgendwie war ich von VBA ausgegangen. ;(

    Edit:
    Falls das beruflich ist: Da ist doch bestimmt Excel, Word oder Co. mit VBA vorhanden. Da geht dann die API.
    Gruß
    Peterfido

    Keine Unterstützung per PN!