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-Key: 331264

Url: https://administrator.de/contentid/331264

Printed on: April 19, 2024 at 23:04 o'clock

Member: rubberman
rubberman Mar 05, 2017 at 16:26:06 (UTC)
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
Member: laster
laster Mar 05, 2017 at 19:13:34 (UTC)
Goto Top
Hallo,
ja mit touch geht das. In Windows mit UnxUtils oder CoreUtils for Windows, ...

vG
LS
Member: colinardo
colinardo Mar 05, 2017 updated at 19:37:04 (UTC)
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
Member: X-Spezi
X-Spezi Mar 06, 2017 at 14:34:32 (UTC)
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
Mitglied: 132272
132272 Mar 06, 2017 updated at 14:57:21 (UTC)
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ß
Member: rubberman
rubberman Mar 06, 2017 at 18:01:00 (UTC)
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
Member: X-Spezi
X-Spezi Mar 10, 2017 at 17:41:56 (UTC)
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
Mitglied: 132658
132658 Mar 10, 2017 at 19:13:02 (UTC)
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
Member: rubberman
Solution rubberman Mar 10, 2017 updated at 21:40:38 (UTC)
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
Member: X-Spezi
X-Spezi Mar 12, 2017 at 12:58:42 (UTC)
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
Member: rubberman
rubberman Mar 12, 2017 at 13:23:36 (UTC)
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