- Offizieller Beitrag
Ich habe bei mir regelmäßig wiederkehrende Aufgaben, deren Ergebnisse in neuen Ordnern abgelegt werden. Diese Ordner haben immer einen Bezug zum Datum (als Sortierkriterium) und optional beschreibenden Text. Um nicht jedes mal händisch den Ordnernamen erstellen zu müssen, hatte ich im jeweiligen Root-Verzeichnis eine AutoIt-Datei, die bei Ausführung den gewünschten Ordner erstellt. Nachdem ich das in 3 Variationen hatte, entschied ich mich eine flexible Lösung zu erstellen, in der die Datei aus ihrem Namen heraus den Befehl zur Formatierung des neuen Ordners erhält. Herausgekommen ist dabei der folgende Code. Vielleicht kann das auch für jemand anderen nützlich sein.
AutoIt
;-- TIME_STAMP 2018-11-08 19:11:51
#cs
Als "OrdnerNeu_.exe" kompilieren (oder ähnlich).
Alle Zeichen bis inkl. des ersten '_' werden für den neuen Ordnernamen ignoriert.
Für den jeweiligen Bedarf wird dann eine Formatierungsregel hinter dem '_' angefügt.
Enthält der Dateiname keinen Formatstring nach dem '_', wird als Standard 'JJJJ-MM-DD' verwendet.
Hier die einsetzbaren Variablen, die eigenständig Datumsoperationen veranlassen:
JJJJ - Jahr aktuell vierstellig
JJJj - Jahr (aktuelles Jahr -1) vierstellig
jjjJ - Jahr (aktuelles Jahr +1) vierstellig
JJ - Jahr aktuell zweistellig
Jj - Jahr (aktuelles Jahr -1) zweistellig
jJ - Jahr (aktuelles Jahr +1) zweistellig
MM - Monat aktuell
Mm - Monat (aktueller Monat -1, ggf. Anpassung Jahr erfolgt automatisch)
mM - Monat (aktueller Monat +1, ggf. Anpassung Jahr erfolgt automatisch)
DD - Tag aktuell
Dd - Tag (Heute -1, ggf. Anpassung Monat und Jahr erfolgt automatisch)
dD - Tag (Heute +1, ggf. Anpassung Monat und Jahr erfolgt automatisch)
Trennzeichen zwischen den Datumsteilen sind beliebig und optional, ausgenommen für Dateinamen nicht zulässige Zeichen: \ / : * ? " < > |
Zusätzlicher Text ist in eckigen Klammern einzufügen.
Evtl. eckige Klammern innerhalb des Textes sind mit sich selbst zu maskieren.
Beispiele
DATUM-HEUTE DATEINAME NAME-DES-NEUEN-ORDNERS
2016/03/01 OrdnerNeu_[Sicherung ]JJJJ-MM-Dd.exe 'Sicherung 2016-02-29'
2016/03/01 OrdnerNeu_[[[Sicherungen]]]JJJJ-Mm.exe '[Sicherungen]2016-02'
2018/10/06 OrdnerNeu_[[[Fotos]]]JJJJ-mM.exe '[Fotos]2018-11'
2018/11/01 OrdnerNeu_JJJJ_MM_DD.exe '2018_11_01'
2018/11/10 OrdnerNeu_.exe == OrdnerNeu_JJJJ-MM-DD.exe '2018-11-10'
#ce
#include <Date.au3>
_CreateFolderFromFilename()
Func _CreateFolderFromFilename()
Local $sFile = @ScriptName
; Format-String abschneiden
Local $iPos = StringInStr($sFile, '_')
If $iPos = 0 Then Exit MsgBox(16, 'FEHLER', '"_" nicht im Dateinamen.')
Local $sFolder = StringTrimLeft($sFile, $iPos)
$sFolder = StringLeft($sFolder, StringInStr($sFolder, '.', 0, -1) -1)
If $sFolder = '' Then $sFolder = 'JJJJ-MM-DD'
; Klammern innerhalb von Text maskieren
$sFolder = StringReplace(StringReplace($sFolder, '[[', Chr(1), 0, 1), ']]', Chr(2), 0, 1)
; evtl. Text separieren
Local $sText, $aTextPart = StringRegExp($sFolder, '\[([^]]+)]', 1)
If Not @error Then
$sText = $aTextPart[0]
; ersetzen mit "T"
$sFolder = StringReplace($sFolder, '[' & $sText & ']', 'T')
Else
$sText = ''
EndIf
; aktuelle Datumswerte
Local $iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY
; Angaben aus Formatstring abfragen
Local $sYear = '', $sMon = '', $sDay = '', $sTmp
Local $aRet = StringRegExp($sFolder, '([Jj]+)', 1)
If Not @error Then $sYear = $aRet[0]
$aRet = StringRegExp($sFolder, '([Mm]+)', 1)
If Not @error Then $sMon = $aRet[0]
$aRet = StringRegExp($sFolder, '([Dd]+)', 1)
If Not @error Then $sDay = $aRet[0]
; Datumswerte bilden
Local $sTmp = StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay)
If ($sYear == 'JJJj') Or ($sYear == 'Jj') Then $sTmp = _DateAdd('Y', -1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
If ($sYear == 'jjjJ') Or ($sYear == 'jJ') Then $sTmp = _DateAdd('Y', +1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
If $sMon == 'Mm' Then $sTmp = _DateAdd('M', -1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
If $sMon == 'mM' Then $sTmp = _DateAdd('M', +1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
If $sDay == 'Dd' Then $sTmp = _DateAdd('D', -1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
If $sDay == 'dD' Then $sTmp = _DateAdd('D', +1, StringFormat('%i/%02i/%02i', $iYear, $iMonth, $iDay))
$iYear = StringRegExpReplace($sTmp, '(\d{4})/\d{2}/\d{2}', '\1')
$iMonth = StringRegExpReplace($sTmp, '\d{4}/(\d{2})/\d{2}', '\1')
$iDay = StringRegExpReplace($sTmp, '\d{4}/\d{2}/(\d{2})', '\1')
; und im Formatstring ersetzen
$sFolder = StringReplace($sFolder, 'JJJJ', $iYear)
$sFolder = StringReplace($sFolder, 'JJJj', $iYear)
$sFolder = StringReplace($sFolder, 'jjjJ', $iYear)
$sFolder = StringReplace($sFolder, 'JJ', StringRight($iYear, 2))
$sFolder = StringReplace($sFolder, 'Jj', StringRight($iYear, 2))
$sFolder = StringReplace($sFolder, 'jJ', StringRight($iYear, 2))
$sFolder = StringReplace($sFolder, 'MM', StringFormat('%02i', $iMonth))
$sFolder = StringReplace($sFolder, 'Mm', StringFormat('%02i', $iMonth))
$sFolder = StringReplace($sFolder, 'mM', StringFormat('%02i', $iMonth))
$sFolder = StringReplace($sFolder, 'DD', StringFormat('%02i', $iDay))
$sFolder = StringReplace($sFolder, 'Dd', StringFormat('%02i', $iDay))
$sFolder = StringReplace($sFolder, 'dD', StringFormat('%02i', $iDay))
; falls zusätzlicher Text vorhanden -> wiederherstellen
If $sText <> '' Then
$sFolder = StringReplace($sFolder, 'T', $sText)
; evtl. Klammern innerhalb Text wiederherstellen
$sFolder = StringReplace(StringReplace($sFolder, Chr(1), '[', 0, 1), Chr(2), ']', 0, 1)
EndIf
; Ordner als Unterordner von @ScriptDir erstellen
$sFolder = StringFormat('%s\%s', @ScriptDir, $sFolder)
If Not FileExists($sFolder) Then DirCreate($sFolder)
EndFunc
Alles anzeigen