loki.81
Goto Top

Batch Abfrage über Änderungsdatum

Hallo,

meine Überwachungskamera schreibt über den Tag hinweg sehr viele Video Files.
Mich interessieren aber vorwiegend nur Videos, die in den Nachtstunden erstellt werden.
Diese würde ich gerne über eine Batch Datei in einen separaten Ordner kopieren.

Ausschlaggebend wäre hier das Änderungsdatum der Datei, genauer die Änderungszeit. (Die Erstellzeit ist leider immer 02:00 Uhr)
Wenn diese zwischen 22:00 und 06:00 Uhr liegt, soll das Video kopiert werden.

Wie setze ich das am besten um.
Habe hierzu bisher nichts hilfreiches gefunden.

Besten Dank vorab.

Viele Grüße
Loki

Content-ID: 616926

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

Ausgedruckt am: 26.11.2024 um 08:11 Uhr

rubberman
Lösung rubberman 28.10.2020 um 21:03:42 Uhr
Goto Top
@echo off &setlocal
for %%i in ("C:\irgendwo\*.mov") do for /f "tokens=2" %%j in ("%%~ti") do (  
  call :is_in_time_range "22:00" "06:00" "%%j"  
  if not errorlevel 1 ECHO copy "%%i" "C:\separater Ordner\"  
)
PAUSE
exit /b

:: expected format of the 3 arguments: " h|hh[:mm[:ss[,cc|.cc]]]"  
:: minutes, seconds, or centi seconds which are not specified are treated as zero
:is_in_time_range    "begin (including)"    "end (excluding)"    "time to be evaluated"  
setlocal EnableDelayedExpansion
for /f "tokens=1-4 delims=:., " %%i in ("%~1") do (set h=00%%i&set m=00%%j&set s=00%%k&set c=00%%l&set b=#!h:~-2!!m:~-2!!s:~-2!!c:~-2!)  
for /f "tokens=1-4 delims=:., " %%i in ("%~2") do (set h=00%%i&set m=00%%j&set s=00%%k&set c=00%%l&set e=#!h:~-2!!m:~-2!!s:~-2!!c:~-2!)  
for /f "tokens=1-4 delims=:., " %%i in ("%~3") do (set h=00%%i&set m=00%%j&set s=00%%k&set c=00%%l&set t=#!h:~-2!!m:~-2!!s:~-2!!c:~-2!)  
if !b! lss !e! (set r=1&if !t! geq !b! if !t! lss !e! set r=0) else (set r=0&if !t! geq !e! if !t! lss !b! set r=1)
endlocal&exit /b %r%

Quell- und Zielordner sowie Dateiendung anpassen. Wenn die richtigen Dateien ausgegeben werden, entferne ECHO und PAUSE um das Ding scharf zu schalten.

Steffen
Loki.81
Loki.81 29.10.2020 um 19:03:24 Uhr
Goto Top
Perfekt, dank dir!
Macht genau das, was es soll...

EIne Kleinigkeit noch - hast du einen Tip, wie man das Script dazu bringt, auch die Unterordner der Quelle zu durchsuchen?
Die Kamera legt folgende Ordnerstruktur an:

\Kamera\Monat\Tag\
rubberman
rubberman 29.10.2020 um 19:06:31 Uhr
Goto Top
Kein Problem, aber bevor ich antworte, soll diese Ordnerstruktur dann auch im Ziel wieder aufgebaut werden, oder ist das egal?

Steffen
Loki.81
Loki.81 29.10.2020 um 19:18:18 Uhr
Goto Top
Nein, die Ordnerstruktur im Ziel ist egal.
Da reicht es wenn alle Dateien in einem Verzeichnis liegen...
rubberman
rubberman 29.10.2020 um 20:08:32 Uhr
Goto Top
Ja dann ... Zeile 2:
for /r "C:\irgendwo" %%i in ("*.mov") do for /f "tokens=2" %%j in ("%%~ti") do (  
Steffen
Loki.81
Loki.81 29.10.2020 um 21:00:12 Uhr
Goto Top
Kann es sein, dass da mit der Zeitberechnung noch etwas nicht stimmt?
Läuft das Script noch auf Sommerzeit? face-wink

Lege ich call :is_in_time_range "00:00" "05:00" "%%j" fest, erhalte ich Datein mit einem Änderungsdatum zwischen 01:00 und 05:59

Ist jetzt nicht dramatisch. Kann ich einfach anpassen, in dem ich den Wert eine Stunde vorstelle... dann bekomme ich alles bis 04:59.
Nur der vollständigkeit halber, falls noch jemand das Script verwenden möchte...
rubberman
rubberman 29.10.2020 aktualisiert um 22:02:13 Uhr
Goto Top
Oh jetzt stellst du ne gute Frage. Vergleiche mal ein
echo "%%~i" %%~j&pause  
zwischen Zeile 2 und 3 mit dem was dir in den Eigenschaften für diese Datei angezeigt wird. Ich hab jetzt ehrlich gesagt keine Datei parat, die ich zur Sommerzeit zu einer Uhrzeit erstellt habe, an die ich mich noch erinnern kann ... Ich weiß nicht ob die Filetime in diesem Fall für die Anzeige von Sommer in Winterzeit umgerechnet wird. Würde mich aber nicht wundern. Denn die Filetime Eigenschaft selbst, ist UTC. Die Lokalisierte Zeit erledigt die Explorer Shell.

Steffen
Loki.81
Loki.81 30.10.2020 um 15:02:01 Uhr
Goto Top
Ja, dein Echo gibt die Uhrzeit der Datei bei älteren Dateien auch eine Stunde früher an, als es im Windows Explorer angezeigt wird.
Änderungsuhrzeit laut Explorer 04:20, Echo der Batch 03:20.

Bei Videos die nach der Zeitumstellung erstellt wurden, besteht das Problem nicht. face-smile
146189
Lösung 146189 30.10.2020 aktualisiert um 16:25:28 Uhr
Goto Top
Würde das ja gleich mit nem bisl Powershell machen, geht auch mit nem Einzeiler in ne Batch verpflanzt wenn man unbedingt will:
@echo off
set "quelle=D:\Videos"  
set "ziel=D:\Ziel"  
powershell -EP Bypass -C "ls '%quelle%' -File -Recurse | ?{$_.LastWriteTime.Hour -ge 22 -or $_.LastWriteTime.Hour -lt 6} | cp -Destination '%ziel%' -verbose"  
rubberman
rubberman 30.10.2020 um 16:13:46 Uhr
Goto Top
dein Echo gibt die Uhrzeit der Datei bei älteren Dateien auch eine Stunde früher an
Dann ist das ein Problem der CMD, kann ich also nicht beeinflussen.
Wenn der PS Aufruf von @146189 für dich auch OK ist, nutze den. Lediglich Option -Recurse bzw. -s müsstest du noch für ls ergänzen, um Unterverzeichnisse mit einzubeziehen.

Steffen
Loki.81
Loki.81 03.11.2020 um 12:08:27 Uhr
Goto Top
Danke für Eure Hilfe...

Die PS schaue ich mir bei Gelegenheit nochmal an.
Vorerst reicht die Batch aber mal aus!