Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Kopieren von Dateien ab gestern Abend 20 Uhr - Jede Woche

Frage Entwicklung

Mitglied: diekoenigs

diekoenigs (Level 1) - Jetzt verbinden

24.05.2013 um 14:39 Uhr, 2739 Aufrufe, 12 Kommentare

Hallo liebe Helfer.

Habe alles soweit mit eurer hilfe hinbekommen und schon kommt die nächste Aufgabe.

Ich muss jeden Samstag einen Job laufen lassen, der alle Dateien, die am Vortag ab 20 Uhr erstellt wurden, kopieren.
Robocopy mag nur /MAXAGE und so.. aber keine Uhrzeit.

Wie bekomme ich das hin?

gruß
Alex
Mitglied: MrNetman
24.05.2013 um 15:39 Uhr
die Variablen %date% %time% und xcopy/robocopy in einer Batchdatei ...

Gruß
Netman
Bitte warten ..
Mitglied: diekoenigs
24.05.2013 um 15:58 Uhr
Danke MrNetman,

jedoch weiss ich nicht wie ich das benutzen kann..

Habe sowas gefunden..
Kann es aber nicht interpretieren bzw. verstehe die Anweisung nicht.

copy meinedatei.xyz "%date% %time:~0,2%-%time:~3,2%-%time:~6,2%"

Ich denke das würde mir schon helfen.

Gruß
Alex
Bitte warten ..
Mitglied: diekoenigs
24.05.2013 um 16:30 Uhr
Ich kann mit:

Get-ChildItem -Recurse E:\ | Where-Object {$_.LastWriteTime -gt (Get-Date).AddHours(-20)}

eine Liste mit den Dateien anzeigen lassen. (powershell)
Aber wie kann ich dieses Ergebnis an den Copy-Befehl (xcopy oder Robocopy) übergeben?

Gruß
Alex
Bitte warten ..
Mitglied: rubberman
25.05.2013 um 00:39 Uhr
Hallo diekoenigs,

ggf. könnte dir WMIC helfen.
Teste folgenden Batch:
01.
@echo off &setlocal 
02.
 
03.
set "fDrive=%~d0" &rem Laufwerksbuchstabe und Doppelpunkt (zB. C:) 
04.
set "fPath=%~p0"  &rem Pfad mit vor- und nachgestelltem Backslash (zB. \test\abc\) 
05.
 
06.
for /f %%i in ('WMIC PATH Win32_LocalTime GET Year^,Month^,Day /Value^|findstr .') do set /a %%i 
07.
:: echo heute %Year% %Month% %Day% 
08.
 
09.
set /a a=14-Month,a/=12,b=Year+4800-a,c=Month+12*a-3,d=153*c+2 
10.
set /a d=d/5+Day+b*365+b/4-b/100+b/400-2 
11.
set /a e=4*d+3,e/=146097,f=-e*146097,f/=4,f+=d 
12.
set /a g=4*f+3,g/=1461,h=-1461*g,h/=4,h+=f,i=5*h+2,i/=153,Day=153*i+2,Day/=5 
13.
set /a Day=-Day+h+1,Month=-i/10,Month*=12,Month+=i+3,Year=e*100+g-4800+i/10 
14.
:: echo gestern %Year% %Month% %Day% 
15.
 
16.
if %Month% lss 10 set Month=0%Month% 
17.
if %Day% lss 10 set Day=0%Day% 
18.
set "LastModified=%Year%%Month%%Day%200000.000000+000" 
19.
:: echo suche Timestamp groesser %LastModified% 
20.
 
21.
for /f "delims=" %%i in ( 
22.
  'WMIC DATAFILE WHERE "drive='%fDrive%' AND path='%fPath:\=\\%' AND LastModified > '%LastModified%'" GET Name /Value' 
23.
) do for /f "delims=" %%j in ("%%i") do ( 
24.
  set "%%j" 
25.
  call :copy 
26.
27.
pause 
28.
goto :eof 
29.
 
30.
:copy 
31.
echo kopiere "%Name%" 
32.
goto :eof
Falls die gesuchten Dateien gefunden werden, ersetze Zeile 31 mit einer entsprechenden Kommandozeile zum Kopieren.

Grüße
rubberman
Bitte warten ..
Mitglied: 76109
25.05.2013 um 15:07 Uhr
Hallo rubberman!

Deine Berechnungen sind mir irgendwie zu Hoch, aber vom Ergebnis her (in Codezeile 18), sollten es auch die beiden Script-Beispiele tun

Wenn's ein bestimmter Tag der Woche sein soll, wäre die Vorgabezeit vielleicht so etwas einfacher zu ermitteln:
01.
@echo off & setlocal 
02.
Set So=1 & Set Mo=2 & Set Di=3 & Set Mi=4 & Set Do=5 & Set Fr=6 & Set Sa=7 
03.
 
04.
set "StartDay=%Fr%" 
05.
set "StartTime=200000.000000+000" 
06.
 
07.
set "S=%temp%\GetStartTime.vbs" 
08.
>%S% Echo D=Date-Weekday(Date,WScript.Arguments(0))+1:WScript.Echo Year(D)^&Right("0"^&Month(D),2)^&Right("0"^&Day(D),2) 
09.
 
10.
for /f "tokens=1" %%d in ('cscript //nologo "%S%" %StartDay%') do Set "LastModified=%%d%StartTime%" 
11.
 
12.
echo %LastModified%
Wobei in diesem Beispiel, von Samstag bis Donnerstag das LastModified vom letzten Freitag zurückgegeben wird...

Oder wenn's eine bestimmte Anzahl von Tagen sein soll, dann sollte es auch so gehen:
01.
@echo off & setlocal 
02.
 
03.
set "AnzahlTage=1" 
04.
set "StartZeit=200000.000000+000" 
05.
 
06.
set "S=%temp%\GetStartTime.vbs" 
07.
>%S% Echo D=Date-WScript.Arguments(0):WScript.Echo Year(D)^&Right("0"^&Month(D),2)^&Right("0"^&Day(D),2) 
08.
 
09.
for /f "tokens=1" %%d in ('cscript //nologo "%S%" %AnzahlTage%') do Set "LastModified=%%d%StartZeit% 
10.
 
11.
echo %LastModified%
Gruß Dieter
Bitte warten ..
Mitglied: rubberman
25.05.2013, aktualisiert um 16:08 Uhr
Hallo Dieter!

Deine Berechnungen sind mir irgendwie zu Hoch
Eigentlich ist es nur ein Algorithmus für Datum zu Julianischem Datum (fortlaufende Nummerierung der Tage) und wieder zurück. Findet sich so oder ähnlich im Internet. Das "-2" am Ende der Zeile 10 ist dafür verantwortlich, dass das gestrige Datum berechnet wird.
Batch kennt leider keinen Datentyp für Datum und Zeit, erst recht keine Arithmetik dafür. Darum ist so etwas nötig wenn man bei Batch pur bleiben möchte.

aber vom Ergebnis her (in Codezeile 18), sollten es auch die beiden Script-Beispiele tun
Natürlich kann man auch VBScripts dafür einbinden Ist jedem selbst überlassen.

Grüße
rubberman
Bitte warten ..
Mitglied: 76109
25.05.2013 um 17:43 Uhr
Hallo rubberman!

Achsooo, Julianisches Datum

Danke für die Info! Werde mich bei Gelegenheit mal damit auseinandersetzen

Gruß Dieter
Bitte warten ..
Mitglied: rubberman
25.05.2013, aktualisiert um 18:25 Uhr
Hallo Dieter!

Als Vorlage haben mir diese beiden Funktionen gedient:
DateToMJD und MJDToDate
Um eine Punktlandung auf einem Stichtag (für das "echte" Julianische Datum der 1. Januar 4713 B.C.) zu erreichen, ist noch ein entsprechendes Offset nötig. Da ich beide Berechnungen nacheinander durchführe, kürzt sich dieses Offset natürlich raus.

BTW Wie du weißt wird ein DateTime Wert in VBScript intern auch als numerischer Wert gehandelt. Du kannst getrost davon ausgehen, dass für die Darstellung als Datums- oder Zeitstring ganz ähnliche Algorithmen ablaufen.

Grüße
rubberman
Bitte warten ..
Mitglied: Biber
25.05.2013, aktualisiert 26.05.2013
Moin didi und rubberman,

ehrlich gesagt wären mir eure Lösungen etwas suspekt, wenn ich diekoenigs hiesse bzw. eigentlich als Anfänger nur fremde Codezeilen verwenden will, bei denen ich nachvollziehen kann, was da abgeht.

Ich würde daher folgenden uneleganten, aber vielleicht auch für Laien verständlichen Weg skizzieren:

Anforderung. Kopiert werden sollen aus einem Verzeichnis alle geänderten Dateien seit gestern 20h.

Ich kann in zwei Teilprobleme zerlegen.
Das sind doch anders ausgedrückt alle Dateien dieses Verzeichnisses
  • mit dem Tagesdatum von heute==25.05.2013==%date%
  • und die mit dem Tagesdatum von Gestern=24.05.2013 und einer Uhrzeit größer 20.00h

Wie oben geschrieben wurde - mit Datumtyp-Werten rechnen geht nicht im Batch, weil Batch keinen Datentyp "Datum" kennt.

Aber ich kann dafür einen (auch wieder wie oben bei didi per Batch im %temp%-Verzeichnis erzeugten) VBS-Einzeiler aufrufen, der mir "gestern" zurückgibt.

01.
'Gestern.vbs 
02.
Wscript.Echo DateAdd("d", date, -1)
Damit kann ich wiederum im Batch eine Variable %gestern% füllen:
01.
.. 
02.
set "S=%temp%\Gestern.vbs" 
03.
.. 
04.
for /f %%d in ('cscript //nologo "%S%"') do Set "gestern=%%d"  
05.
...
Wenn ich dann im Batch das "heute" (ja, ist in %date%) und das "Gestern" (ist in %gestern%) kenne, dann ist der Rest einfach:

[Edit] Nur zur Erläuterung für Nicht-täglicher-Bätcher
Denn wenn ich einzelne Dateien als Variable %i durch eine FOR-Anweisung nudele, dann steht mir Datum/Zeit als Text im Format [tt.mm.jjjj hh:nn.ss] in der Variablen %~ti zur Verfügung. Die beiden möglichen Datumswerte "gestern" und "heute" kann ich mit einem exakten Textvergleich prüfen, eine Uhrzeit größer 20:00 mit einem GEQ (größer gleich).
[/Edit]


Beispiel am CMD für die zwei Kopierläufe für Heute+Gestern, wenn %gestern% mit z.B. 24.05.2013 gefüllt ist

#Vergleich auf "Heute"-Dateien 
>For %i in (D:\quelle\*.*) do @for /f "tokens=1,2" %a in ("%~ti") do @if [%a]==[%date%] @echo kopiere "%i" x:\nachZiel\ 
 
#Vergleich auf Dateien von "gestern" UND >= 20:00h 
>For %i in (D:\quelle\*.*) do @for /f "tokens=1,2" %a in ("%~ti") do @if [%a]==[%gestern%] @if [%b] GEQ [20:00] @echo kopiere "%i" x:\nachZiel\
Ich denke mal, wenn das Vorgehen klar ist, dann lassen sich diese Baukastenzeilen auch einen Batch packen, der dann -und das wäre eben mein Hauptanliegen- von einem Nicht-Coder anpassbar und wartbar ist.

Ich kann doch keinem Forumsneuling erzählen, dass er über 1. Januar 4713 B.C. und Julianische Kalender recherchieren gehen muss, um auf das Datum von "Gestern" zu kommen. Der meldet sich sofort wieder ab.

Grüße
Biber
Bitte warten ..
Mitglied: rubberman
25.05.2013, aktualisiert um 20:43 Uhr
Hallo Biber,

OK, OK. Zur Ehrenrettung: Der "Forumsneuling" ist seit 2008 dabei und nennt sich Administrator. Ich denke wer Deine dreifach verschachtelten FOR Schleifen am Prompt versteht, ist auch in der Lage unsere Lösungen nachzuvollziehen und umgekehrt Uuund "Julianischer Kalender" NEQ "Julianisches Datum" (aber das ist Korinthenkackerei)

Ich gebe zu, dass ich die Algorithmen für das Julianische Datum auch nicht herleiten kann, das ist aber auch Nebensache. Was sie tun, sollte klar sein.
WMIC halte ich für ein Tool, das viel zu wenig Beachtung findet, obwohl es eine Menge Potenzial hat. Ich wollte einfach mal einige Möglichkeiten aufzeigen.

Grüße
rubberman
Bitte warten ..
Mitglied: Biber
26.05.2013, aktualisiert um 16:58 Uhr
Moin rubberman,

ich gehe davon aus, dass du ebenso wie didi weisst, wie eure Kommentare und Codebeispiele hier geschätzt werden und diese fast immer blind als Copy&Paste-Lösung übernommen werden können.

Ich habe mich eigentlich nach längerem stillen Mitlesen hier eingeschaltet wegen drei Details, die auch in meiner täglichen Arbeit ständig Risiko bedeuten:

  • trotz vermeintlich detailliert formulierter Anforderung wird locker variiert. Aus "seit gestern nach 20h" wird bei didi "alles seit Freitag 20h, falls heute Sa bis Donnerstag ist". In der Powershell-Variante wird sogar "alles jünger als 20 Stunden" daraus. Und am Schlimmsten: wenn mal aus irgendwelchen Gründen der Jeden-Samstag-automatisch-Job nicht läuft, dann habe ich weder eine Fehlerinfo darüber noch einen Plan B, wie ich die Kopiererei nachhole. didis Variante versucht ja, dieses Manko auszubügeln, ohne den Beitragsersteller auf diese Sollbruchstelle hinzuweisen.

  • ich empfinde es immer als grosses Risiko, wenn der Code nicht ohne weiteres nachvollziehbar ist und letzten Endes nur vom Programmierer selbst angepasst werden kann

  • und das dritte Unbehagen kam von der - ich sach ma' Unverhältnismäßigkeit der Mittel. Wenn ich zum Ermitteln der Dateien drei Werkzeuge brauche (Batch, VBS und WMIC), dann ist ja wohl keines der drei Tools allein so richtig geeignet dafür.

Ein durchgängiger Ansatz z.B. ganz in VBS wäre mir da lieber (über das FileSystemObject und Property .DateLastModified ist das auch kein Hexenwerk) oder auch der Einsatz eines One-Trick-Tools wie WasFile.exe von Horst Schaeffer.

Wie dem auch sei - mögliche Lösungswege sind nun reichlich da, ich warte jetzt auch auf den Beitragsersteller.

Grüße
Biber
Bitte warten ..
Mitglied: 76109
26.05.2013 um 15:20 Uhr
Hallo Biber!

Ein durchgängiger Ansatz z.B. ganz in VBS wäre mir da lieber (über das FileSystemObject und Property .DateLastModified ist das auch kein Hexenwerk) oder auch der Einsatz eines One-Trick-Tools wie WasFile.exe von Horst Schaffer.
Den Gedanken hatte ich schon im Hinterkopf, aber da das Ganze theoretisch auch rekursive über mehrere Ordner ablaufen könnte, wieder verworfen, weil mir persönlich Batch in diesem Fall als besser geeignet erscheint und rubbermans Script, wenn auch ein wenig abgehoben, finde ich durchaus interessant...

Wie dem auch sei - mögliche Lösungswege sind nun reichlich da, ich warte jetzt auch auf dem Beitragsersteller.
Das wäre auch mein Vorschlag gewesen

Noch einen schönen Sonntag!

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft Office
Mehr als 20 Excel Dateien öffnen gleichzeitig (7)

Frage von PizzaPepperoni zum Thema Microsoft Office ...

C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Batch & Shell
Dateien kopieren die nicht mehr verändert werden? (10)

Frage von pbelcl zum Thema Batch & Shell ...

Windows Server
gelöst Administrator kann auf Server keine EXE-Dateien kopieren, löschen, anlegen (5)

Frage von Winfried-HH zum Thema Windows Server ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...