x-spezi
Goto Top

Erstelldatum vieler Dateien ändern (aus Dateinamen abgeleitet)

Hallo,

ich suche ein Batch womit ich das Erstellungsdatum nach den 1. Nummern (Datum) des Dateinamens verändern kann.

Beispiel:

2014-12-Video_04711.mpeg ist mit Änderungsdatum 10.01.2017

Nach Batchlauf

2014-12-Video_04711.mpeg > Änderungsdatum 01.12.2014


oder teilweise habe die Dateien auch diese Beschreibung

01.12.2014-Video_04711.mpeg ist mit Änderungsdatum 10.01.2017

Nach Batchlauf

01.12.2014-Video_04711.mpeg Änderungsdatum 01.12.2014

Viele Grüße

Horst

Content-ID: 331264

Url: https://administrator.de/forum/erstelldatum-vieler-dateien-aendern-aus-dateinamen-abgeleitet-331264.html

Ausgedruckt am: 23.12.2024 um 08:12 Uhr

rubberman
rubberman 05.03.2017 um 17:26:06 Uhr
Goto Top
Hallo Horst.

Windows hat dafür kein Batch-Tool an Bord. Suche mal im Netz nach Progrämmchen mit Name "touch". Findest du nichts, könnte ich dir mein eigenes zur Verfügung stellen.

Da ich aber weiß, dass das Ganze per PowerShell machbar ist, warte besser erst auf die PS Experten, dann brauchst du keine Drittprogramme ...

Grüße
rubberman
laster
laster 05.03.2017 um 20:13:34 Uhr
Goto Top
Hallo,
ja mit touch geht das. In Windows mit UnxUtils oder CoreUtils for Windows, ...

vG
LS
colinardo
colinardo 05.03.2017 aktualisiert um 20:37:04 Uhr
Goto Top
Servus,
Zitat von @rubberman:
Da ich aber weiß, dass das Ganze per PowerShell machbar ist, warte besser erst auf die PS Experten, dann brauchst du keine Drittprogramme ...
Bidde face-smile
gci 'D:\Videos' -Filter *.mpeg | ?{!$_.PSIsContainer -and $_.Basename -match '^(\d{4}-\d{2}|\d{2}\.\d{2}\.\d{4})'} |%{  
    $d = get-date $matches[1]
    $_.CreationTime = $d; $_.LastWriteTime = $d
}
womit ich das Erstellungsdatum
Änderungsdatum
Ja watt denn nu??
Kannst du im Skript aber einfach anpassen, Es gibt $_.CreationTime (Erstelldatum) und $_.LastWriteTime (Änderungsdatum). Ich habe einfach mal beide geändert.

Grüße Uwe
X-Spezi
X-Spezi 06.03.2017 um 15:34:32 Uhr
Goto Top
Hallo,

also ich finde das Programm "touch" so nicht.
Es währe also gut wenn du mir dieses zur Verfügung stellen würden.
Mit Power Shell habe ich keine Erfahrung.

Ein Batch währe für mich am einfachsten.

Grüße

Horst
132272
132272 06.03.2017 aktualisiert um 15:57:21 Uhr
Goto Top
Zitat von @X-Spezi:

Hallo,

also ich finde das Programm "touch" so nicht.
Ist ja auch ein Linux-Tool face-wink
Es währe also gut wenn du mir dieses zur Verfügung stellen würden.
Mit Power Shell habe ich keine Erfahrung.

Ein Batch währe für mich am einfachsten.

powershell kannst du ganz einfach in Batch direkt ausführen!

@echo off
powershell -E Bypass -c "gci 'D:\Videos' -Filter *.mpeg | ?{!$_.PSIsContainer -and $_.Basename -match '^(\d{4}-\d{2}|\d{2}\.\d{2}\.\d{4})'} | %%{$d = get-date $matches[1];$_.CreationTime = $d; $_.LastWriteTime = $d}"  
Fertig.

Gruß
rubberman
rubberman 06.03.2017 um 19:01:00 Uhr
Goto Top
Ein Batch währe für mich am einfachsten.
Das wage ich zu bezweifeln, die PoweShell-Lösung ist da weitaus einfacher zu verstehen. Aber des Menschen Wille ...

https://www.dropbox.com/s/c64qmz0arwfgzsp/touch.zip?dl=0
Verwendung auf eigene Gefahr, versteht sich. Hilfe gibt's per TOUCH -?

Das Tool zusammen mit der Batchdatei in das Überverzeichnis deiner MPEGS speichern. Es werden rekursiv alle Dateien in den Unterverzeichnissen verarbeitet.
@echo off &setlocal
for /f "delims=" %%i in (  
  'dir /a-d /b /s *.mpeg^|findstr /rie "\\20[0-9][0-9]-[01][0-9]-[^\\]*\.mpeg \\[0-3][0-9]\.[01][0-9]\.20[0-9][0-9]-[^\\]*\.mpeg"'  
) do (
  set "file=%%~i"  
  for /f "tokens=1-3 delims=-." %%j in ("%%~ni") do (  
    set "m=%%k"  
    if %%j lss 2000 (
      set "d=%%j"  
      set "y=%%l"  
    ) else (
      set "y=%%j"  
      set "test=1"  
      for /f "delims=1234567890" %%m in ("%%l") do set "test="  
      if defined test (set "d=%%l") else set "d=01"  
    )
  )
  setlocal EnableDelayedExpansion
  touch -p "!file!" -a -Y !y! -M !m! -D !d!  
  endlocal
)

Falls du doch colinardo's PowerShell-Aufruf aus einer Batchdatei in ähnlicher Weise (rekursiv, ausgehend vom Arbeitsverzeichnis) nutzen willst, dann etwa so:
@echo off
powershell -NoProfile -ExecutionPolicy Bypass -Command "gci '%~dp0' -Filter *.mpeg -Recurse | ?{!$_.PSIsContainer -and $_.Basename -match '^(\d{4}-\d{2}|\d{2}\.\d{2}\.\d{4})'} | %%{$d = get-date $matches[1]; $_.CreationTime = $d; $_.LastWriteTime = $d}"  

Grüße
rubberman
X-Spezi
X-Spezi 10.03.2017 um 18:41:56 Uhr
Goto Top
Danke für die Lösungsbeschreibungen

Aber leider habe ich beiden Fehlermeldungen:
Dateiname für die Änderung ist >2014-12-Video_04711.mpeg<
Bei der 1. Lösung:
( touch ist installiert: )

D:\Video>@echo off &setlocal
for /f "delims=" %%i in (
"%%i" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
'dir /a-d /b /s *.mpeg^|findstr /rie "\\20[0-9][0-9]-[01][0-9]-[^\\]*\.mpeg
[0-3][0-9]\.[01][0-9]\.20[0-9][0-9]-[^\\]*\.mpeg"'
Der Befehl "'dir" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
) do (
set "file=%%~i"
for /f "tokens=1-3 delims=-." %%j in ("%%~ni") do (
"%%j" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
set "m=%%k"
if %%j lss 2000 (
Mehr? set "d=%%j"
Mehr? set "y=%%l"
Mehr? ) else (
Mehr? set "y=%%j"
Mehr? set "test=1"
Mehr? for /f "delims=1234567890" %%m in ("%%l") do set "test="
"%%m" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
if defined test (set "d=%%l") else set "d=01"
)
)
setlocal EnableDelayedExpansion
touch -p "!file!" -a -Y !y! -M !m! -D !d!
Der Befehl "touch" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
endlocal
)


2. Lösung mit PowerShell

PS D:\video> @echo off
At line:1 char:7

back-to-top@echo off

back-to-top~~~

Unexpected token 'off' in expression or statement.
At line:1 char:1

back-to-top@echo off

back-to-top~~~~~

The splatting operator '@' cannot be used to reference variables in an
expression. '@echo' can be used only as an argument to a command. To reference
variables in an expression use '$echo'.
+ CategoryInfo : ParserError: (face-smile , ParentContainsErrorRecordEx
ception
+ FullyQualifiedErrorId : UnexpectedToken

PS D:\video> powershell -NoProfile -ExecutionPolicy Bypass -Command "gci '%~dp0'
-Filter *.mpeg -Recurse | ?{!$_.PSIsContainer -and $_.Basename -match '^(\d{4}-
\d{2}|\d{2}\.\d{2}\.\d{4})'} | %%{$d = get-date $matches[1]; $_.CreationTime = $
d; $_.LastWriteTime = $d}"


Kann mir hier bitte noch einer helfen ?
Wo sind / ist der Fehler ?

Viele Grüße

Horst
132658
132658 10.03.2017 um 20:13:02 Uhr
Goto Top
Hi,
erster Fehler: Du pastest das direkt in die Konsole = Falsch, das kommt in eine Batchdatei!
Zweiter Fehler des PS Skripts :
Das wird nicht in die PS Konsole gepastet sondern kommt ebenfalls in eine Batchdatei, und wird in der CMD ausgeführt nicht in der PS Konsole, also alles falsch gemacht was man falsch machen kann face-wink.

Gruß schnappi
rubberman
Lösung rubberman 10.03.2017 aktualisiert um 22:40:38 Uhr
Goto Top
Bei der Einleitung ...
ich suche ein Batch
... sollte man davon ausgehen, dass das bekannt ist face-sad Zumal ich bereits erklärt hatte:
Das Tool zusammen mit der Batchdatei in das Überverzeichnis deiner MPEGS speichern.
Man erlebt immer wieder Überraschungen.

@X-Spezi
Eine Batchdatei ist eine Textdatei mit Endung .bat oder .cmd

Grüße
rubberman
X-Spezi
X-Spezi 12.03.2017 um 13:58:42 Uhr
Goto Top
Danke an alle,

Das Problem war so wie Schnappi geschrieben hat.

Bisher hatte ich zu Prüfen einen normalen Batch immer direkt in Konsole getestet um evtl. Fehler zu sehen.

Viele Grüße, und noch einen schönen Sonntag

Grüße

Horst
rubberman
rubberman 12.03.2017 um 14:23:36 Uhr
Goto Top
Hallo Horst.

Bisher hatte ich zu Prüfen einen normalen Batch immer direkt in Konsole getestet um evtl. Fehler zu sehen.

Das ist grundsätzlich eine gute Idee, ebenso wie echo on zu setzen, um zu sehen was genau passiert. Dabei sind 2 Dinge zu beachten:
1) Der Code gehört trotzdem in eine Batchdatei. Du rufst dann die Batchdatei mit ihrem Name aus der Konsole auf. (Kannst die Datei bspw. direkt auf das Konsolefenster ziehen, um Schreibfehler zu vermeiden.)
2) Du musst in der Konsole vorher in das Arbeitsverzeichnis der Batchdatei navigieren, wenn der Code von diesem abhängig ist. (Hast du richtig gemacht.)

Grüße
rubberman