Ordner zwischen Server und Client zwischen bestimmten Zeitstempeln erstellen?

1060
Vipul

Ich möchte eine Stapeldatei erstellen, die die Ordner an meinem angegebenen Ziel löscht, und dann alle nach 7 Uhr gestern geänderten Ordner aus meinem Quellcode kopiert. Das liegt daran, dass ich dies täglich um 7 Uhr morgens ausführen möchte.

Das Betriebssystem, das ich verwenden möchte, ist Windows Server 2003.

Grundsätzlich möchte ich in der Lage sein, den aktuellen Inhalt eines Ordners durch alle geänderten Dateien der letzten 24 Stunden zu ersetzen.

0
Ich kann keinen einfachen Weg sehen (dh ohne zusätzliche Tools - zB: rsync oder zumindest mit vbscript). XCOPY / D macht dies nur auf Tagesbasis. carveone vor 10 Jahren 0
Das ist das Problem !!!!!! Vipul vor 10 Jahren 0
Ich verstehe. Es ist möglich, aber langweilig. Sie können verschiedene Batch-Funktionen und Tricks verwenden, um Dateidetails zu extrahieren und zu vergleichen. Ich füge eine Antwort in ein oder zwei Stunden hinzu ... carveone vor 10 Jahren 0

2 Antworten auf die Frage

2
carveone

Windows XP fügte den Batch-Parametern und Befehlen eine ganze Reihe von Funktionen hinzu, die jedoch nicht so einfach zu bedienen sind. Seien Sie beim Zitieren sehr vorsichtig, da Dateien Leerzeichen enthalten können. Ich habe die Anführungszeichen um Dateinamen beibehalten, da es auf diese Weise nützlicher ist.

Der Ort, an dem mit batch begonnen werden soll, ist im Allgemeinen "help" (natürlich in einer CMD-Shell). Dann "cmd /?", "Set /?", "Für /?" und auch die Microsoft Batch-Website . Dies ist, was ich getan habe - es ist nicht vollständig, aber es werden Dateien gedruckt, die seit gestern um 7 Uhr geändert wurden. Ich kann weitere Bits hinzufügen, wenn Sie möchten. Ich bewahre das selbst auf, da ich manchmal wissen möchte, welche Dateien ich heute geändert habe!

(Editiert: Gestern ist schwieriger, als nur einen vom Tag abzuziehen! ...)

@echo off  setlocal  rem Start at current directory. Customise as you wish.  set my_root=.  rem First get yesterday at 7am. rem The format of %DATE% depends on locale so this is a rem hack using a tmp file in VBScript... rem Note the use of the caret, which is the batch escape character  echo yday = DateAdd("d", -1, Date) > "%temp%\tmp$$$.vbs" echo Wscript.Echo DatePart("yyyy",yday) ^& Right("0" ^& DatePart("m",yday), 2) ^& Right("0" ^& DatePart("d",yday), 2) >> "%temp%\tmp$$$.vbs"  for /F %%a in ('cscript //nologo "%temp%\tmp$$$.vbs"') do set after_ymd=%%a  if exist "%temp%\tmp$$$.vbs" del "%temp%\tmp$$$.vbs"  set after_time=0700  echo Files after: %after_ymd% %after_time%  for /R %my_root% %%f in (*.*) do call :checkdate "%%f" "%%~tf"  goto :EOF   :checkdate  set fname=%1 set fdate=%2  for /f "tokens=1-5 delims=./-: " %%a in (%fdate%) do ( set f_d=%%a set f_m=%%b set f_y=%%c set f_hr=%%d set f_mn=%%e )  if %f_y%%f_m%%f_d% LSS %after_ymd% goto :EOF  if %f_y%%f_m%%f_d% EQU %after_ymd% if %f_hr%%f_mn% LSS %after_time% goto :EOF  REM Copy your file here...  echo Newer: %fname%  goto :EOF 

Beachten Sie, dass das Echo von VBScript in einer Batchdatei fehleranfällig ist und unordentlich ist. Die bevorzugte Methode ist das Erstellen einer festen VBS-Datei, die nach Belieben aufgerufen werden kann. Eine andere Möglichkeit ist, das vbscript an das Ende der Batchdatei anzuhängen, jede Zeile mit einem Tag zu markieren, das Skript mit goto: EOF voranzubringen und findstr im Skript selbst zu verwenden, um die Strings auszuspähen (ja, es ist fies). :

echo off & setlocal enableextensions rem Build a script: findstr "'VBS" "%~f0" | findstr /v "findstr" > %TEMP%\tmp$$$.vbs  ....  goto :EOF ' 'VBS DateAdd("d", -1, Date) 'VBS Wscript.Echo DatePart("yyyy",yday) & Right("0" & DatePart("m",yday), 2) & Right("0" & DatePart("d",yday), 2) 'VBS 

Ja. Das ist nicht angenehm.

Danke vielmals!! Carveone .... das ist sehr hilfreich ... aber kannst du bitte klären, was am ersten Tag eines jeden Monats passieren wird !!! Vipul vor 10 Jahren 0
Oh! Guter Fang! Wie Sie sehen, habe ich es für "heute" getan, erinnerte sich daran, dass Sie "gestern" wollten, und warf schnell die beiden Zeilen ein, um eine davon abzuziehen. Ich habe nicht einmal einen anderen Variablennamen verwendet. Das ist es, was ich bekomme, wenn ich keine Randfälle teste. Sie haben Recht - der Code ist in seiner derzeitigen Form nicht korrekt, auch für Datumsangaben wie 20130102, die in 2013011 umgewandelt werden. Oh je. carveone vor 10 Jahren 0
Ich nehme an, es ist zu spät, um zu fragen, ob man VBScript verwenden kann. Es ist standardmäßig auf alles installiert :-) "Gestern" stellt sich als nervig heraus, wenn man Schaltjahre berechnet usw. carveone vor 10 Jahren 0
Ja!!! das war es auch, dem ich gegenüberstand. Um meine gewünschte Ausgabe zu erreichen, habe ich Code aus zwei verschiedenen Quellen zusammengeführt, z. B. Ihren und anderen, die von "Rob van der Woude" geschrieben wurden, um das Datum von gestern zu finden. Und mein Problem ist gelöst. Vielen Dank, dass Sie mir geholfen haben. Vipul vor 10 Jahren 0
Bitte. Ich habe den Code trotzdem mit einer tmp-Datei in vbscript neu geschrieben, weil der vorhandene Code total falsch war und ich wirklich musste! Es war schwieriger als ich dachte, hauptsächlich wegen der führenden Nullen (dank: http://sogeeky.blogspot.ie/2006/08/vbscript-add-leading-zero-to-date.html) und der Seltsamkeit des Batches Datei-Escaping (^) carveone vor 10 Jahren 0
Oh, und ich editierte die Antwort, die scheinbar den Tick "akzeptierte Antwort" zu verlieren scheint. Verdammt... carveone vor 10 Jahren 0
Macht das einen Unterschied, wenn Sie diese "akzeptierte Antwort" loswerden ... Ich danke Ihnen trotzdem für all den Aufwand, den Sie in die Lösung des Problems investiert haben !! VIELEN DANK..!! Vipul vor 10 Jahren 0
0
Thor

Nun, ich empfehle Ihnen, PowerShell auf jedem Gerät zu installieren, auf dem Sie dies ausführen, und Sie sind möglicherweise mit den Ergebnissen zufrieden.

# Define the folder that you want to copy FROM $SourceFolder = "D:\test"  # Define the folder that you want to copy FROM, AND DELETE CONTENTS FROM BEFORE DOING SO $DestinationFolder = "D:\testTarget"  # Make any changes to what criteria you want for the copying $CopyingCriteria = $( Get-ChildItem $SourceFolder | Where-Object { $_.LastWriteTime -gt ((Get-Date).AddDays(-1)) } )  If ( $CopyingCriteria ) { # Delete the items of the folder Get-ChildItem $DestinationFolder | Remove-Item -Force  # Copy the files that have changed using criteria already defined $CopyingCriteria | Copy-Item -Destination $DestinationFolder -Force  }  

Speichern Sie es als " as-you-want.ps1", stellen Sie sicher, dass Sie Ihre Ausführungsrichtlinie auf "Nicht eingeschränkt" festgelegt haben (oder unterschreiben Sie es und ändern Sie es in "AllSigned") und führen Sie es aus!

Danke Thor für den Vorschlag, aber ich kann auf dem Client nichts installieren. Eingeschränkter Zugang. Vipul vor 10 Jahren 0