Solved

If file exists and is older

Posted on 2013-11-26
10
598 Views
Last Modified: 2013-11-26
I'm trying to create a batch file or vbs script that will check to see if there is a new version of a map file on our server, if there is a newer version then I would like it to copy the file off the server to a local c drive, then rename the old file on the local drive to mapfile.old. I also need the batch file or script to ensure I only have one version of the mapfile.old. So at any given time there should only be two files on the local c drive, mapfile.map and mapfile.old. I Know that I can use xcopy to copy the file only if the source is new than the destination but I'm out of thoughts on how to make the rename and deletion only occur if a new file was copied.  The xcopy I am using look like this: xcopy \\x\ManifoldUserUpdates\FisherUS\Maps\nolinkcwpkey.m
ap "c:\fisherus\program files\fisherus\maps"
0
Comment
Question by:cwpower
  • 3
  • 2
  • 2
  • +2
10 Comments
 
LVL 51

Expert Comment

by:Bill Prew
ID: 39677762
So, you only want to copy the .MAP file to the .OLD file when a new .MAP file exists on the server, and will be copied down via XCOPY?

How large is the .MAP file, one approach would be to just always copy the existing .MAP to the .OLD (overwriting), but that is a bit less efficient.

~bp
0
 

Author Comment

by:cwpower
ID: 39677782
Correct the local .map should only be renamed to .old if a new file is copied down. I always need the newest file to have its original name as my end users have shortcut to it on their desktop. The file is currently copied down via xcopy but if there is a more efficient way to do so that would be ok. The file is about 1 GB in size and this batch will run on around 20 computers.
0
 
LVL 34

Accepted Solution

by:
Dan Craciun earned 167 total points
ID: 39677795
Can't test it now, but this should work:

$localCopy = Get-ChildItem "\path\to\file.map"
$localBackup = Get-ChildItem "\path\to\file.old"
$networkCopy = Get-ChildItem "\\path\to\file.map"

$localCopyTime = $localCopy.LastWriteRime
$networkCopyTime = $networkCopy.LastWriteTime

if ($networkCopyTime -gt $localCopyTime) {
  Copy-Item $localCopy -Destination $localBackup
  Copy-Item $networkCopy -Destination $localCopy
}


Replace the paths with your paths.
It simply compares last modified date from the file on the server with the local copy.

HTH,
Dan
0
 
LVL 34

Expert Comment

by:Dan Craciun
ID: 39677807
Yes, it's better to simply delete and rename the backup, so you can use instead of

Copy-Item $localCopy -Destination $localBackup

Remove-Item $localBackup
Rename-Item $localCopy $localBackup
0
 
LVL 43

Assisted Solution

by:Steve Knight
Steve Knight earned 167 total points
ID: 39677832
Various ways, one of which I thought of involves checking the source and dest time stamps and file sizes and comparing:

Steve

@echo off
set source=\\x\ManifoldUserUpdates\FisherUS\Maps
set dest=c:\fisherus\program files\fisherus\maps
set filename=nolinkcwpkey

for %%A in (%source%\%filename%.map) do set sourcefile=%%~tA#%%~zA
for %%A in (%dest%\%filename%.map) do set destfile=%%~tA#%%~zA

echo Source file is %sourcefile%
echo Dest file is %destfile%

if "%sourcefile%"=="%destfile%" (
  echo Nothing to change
) ELSE (
  echo copying new version
  IF EXIST "%dest%\%filename%.old" del "%dest%\%filename%.old"
  IF EXIST "%dest%\%filename%.map" rename "%dest%\%filename%.map" "%filename%.old"
  xcopy "%source%\%filename%.map" "%dest%" /y
)
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 83

Assisted Solution

by:oBdA
oBdA earned 166 total points
ID: 39677840
Plain batch; for security reasons, it only deletes the original after the file has been successfully copied. If it fails, it will leave with errorlevel 1:
@echo off
setlocal
set SourceFile=\\Server\share\mapfile.map
set TargetFile=D:\temp\mapfile.map
for %%a in ("%SourceFile%") do (set SourceDate=%%~ta)
for %%a in ("%TargetFile%") do (
	set TargetDate=%%~ta
	set TargetFolder=%%~dpa
	set TargetName=%%~na
	set TargetExt=%%~xa
)
if "%SourceDate%"=="%TargetDate%" (
	echo Both files have the same time stamp of %SourceDate%; leaving.
	exit /b 1
)
REM When we're here, the file dates differ. Backup the old file and copy the new one from the serverlist
echo The files differ:
echo Source date: %SourceDate%
echo Target date: %TargetDate%
echo Copying '%SourceFile%', this might take a while ...
copy "%SourceFile%" "%TargetFolder%%TargetName%.new"
if errorlevel 1 (
	echo Could not copy the source file '%SourceFile%'; leaving.
	if exist "%TargetFolder%\%TargetName%.new" del "%TargetFolder%\%TargetName%.new"
	exit /b 1
)
REM When we're here, we now have three file versions: .ext, .new, .old
if exist "%TargetFolder%%TargetName%.old" del "%TargetFolder%%TargetName%.old"
if exist "%TargetFile%" "%TargetName%.old" ren "%TargetFile%" "%TargetName%.old"
ren "%TargetFolder%%TargetName%.new" "%TargetName%%TargetExt%"
echo Done.

Open in new window

0
 

Author Comment

by:cwpower
ID: 39677961
Thanks to everyone for the help! Multiple solutions are viable and work as intended.
0
 
LVL 83

Expert Comment

by:oBdA
ID: 39677999
For the sake of completeness, I just saw an error in line 29 (you probably found it, but if somebody else finds it useful) in http:a39677840; the first "%TargetName%.old" should of course not be there and needs to be removed:
if exist "%TargetFile%" "%TargetName%.old" ren "%TargetFile%" "%TargetName%.old"
0
 
LVL 34

Expert Comment

by:Dan Craciun
ID: 39678020
oBdA, your solution was the only one that checked to see if the file was actually copied from the server. Good job.
0
 
LVL 43

Expert Comment

by:Steve Knight
ID: 39678804
No problem, always lots of ways to solve things.

Steve
0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Crystal Report for VS2013 17 42
how to use wail2ban ?? 13 40
Make a border less form movable 2 14
Copy/Clone an object. 9 17
If like me you are one who spends a lot of time working and scripting with cmd.exe, sometimes it is handy to be able to quickly view a calendar for a given month and year. This script will quickly do just that!  Save the code posted below to a .bat …
You may have already been in the need to update a whole folder stucture using a script. Robocopy does it well and even provides a list of non-updated files in a log (if asked to). Generally those files that were locked by a user or a process by the …
This video shows how to remove a single email address from the Outlook 2010 Auto Suggestion memory. NOTE: For Outlook 2016 and 2013 perform the exact same steps. Open a new email: Click the New email button in Outlook. Start typing the address: …
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now