Migrated From JP Software Wiki
Please note that current versions of JP Software products all have update built into the programs so this is not needed, but it does provide a useful technique.
4update.btm
This batch synchronizes a download directory with the jpsoft ftp site.
It is equivalent to
1. rmdir /s mymirror
2. copy /su ftp mymirror
Only doing a copy will not remove the files or directories deleted on the ftp.
Overview
Copy all the updated files from the ftp site.
Write a list of the files in the local directory into a file removing the directory information
Append the name of all the files at the ftp site to this list removing the ftp directory information and changing the / into \.
Sort the list.
Read the list line by line:
Please note that current versions of JP Software products all have update built into the programs so this is not needed, but it does provide a useful technique.
4update.btm
This batch synchronizes a download directory with the jpsoft ftp site.
It is equivalent to
1. rmdir /s mymirror
2. copy /su ftp mymirror
Only doing a copy will not remove the files or directories deleted on the ftp.
- Copy the batch the name is not significant.
- Change the location of the local directory in the batch file: variable localMirror.
- Run the batch no parameters needed.
Overview
Copy all the updated files from the ftp site.
Write a list of the files in the local directory into a file removing the directory information
Append the name of all the files at the ftp site to this list removing the ftp directory information and changing the / into \.
This should make the local names and the ftp names identical.
Sort the list.
Read the list line by line:
- Duplicate names implies that the file in the local directory is up to date.
- If a name occurs only once then either the file or directory was deleted from the ftp or the transfer has failed.
- If a file or a directory exists locally, delete it, otherwise the update must have failed, post a message and continue.
Code:
:: 4update.btm
:: mirror jpsoft ftp download directory
:: ---------------------------------------------------------------- ::
:: set the variable localMirror to the name of your local directory ::
:: ---------------------------------------------------------------- ::
@echo off
setlocal
:: name of your mirror directory
set localMirror=C:\Download\jpsoft\ftp\
:: -- this line allows editor colorizer to work for a global
:! tmp temp
::: set variables
::! curr: filename in mirror
::! f1: unique temp file
::! f2: unique temp file
::! fn: unique temp file used to normalize mirror path name
::! ftp: file name on the ftp
::! line: filename in the list
::! localmirror: mirror directory name
::! prev: file name in the list
::! t: path for temp or tmp directory
::! temp: global
::! tmp: global
set ftp=jpsoft.com
:: Normalize directory
if not direxist %localMirror mkdir %localMirror
set fn=%@unique[%localMirror]
set localMirror=%@path[%fn]
del /q %fn
:: Create a permanent connection
iftp /N ftp://anonymous:pwd@%ftp
:: copy all the files newer then the current files (including empty directories)
copy /fzsgu "ftp:*.*" %localMirror
set t=%tmp
if (%t) == () set t=%temp
set f1=%@unique[%t]
:: list all the files in the backup without the directory information
pdir /s /(@right[-%@len[%localMirror],*]) %localMirror > %f1
:: append all the files in the ftp without the directory information
:: replace / with \
:: all the file names in both set should be identical
pdir /s /(@replace[/,\,%%@right[-4,*]]) "ftp:*.*" >> %f1
set f2=%@unique[%t]
:: order so that duplicate names follow each other
sort %f1 > %f2
:: append a dummy end of file simplify testing the last file
echo + >> %f2
set prev=
do line in @%f2
iff "%prev" == "" then
:: eof when expecting a new name we are done
if "%line" == "+" leave
else
iff "%line" == "%prev" then
set line=
else
set curr=%@quote[%localMirror%%prev]
set ftp=ftp:/%@replace[\,/,%prev]
iff exist %curr .and. exist %ftp then
:: Once in a while pdir seems to miss files
:: maybe others are accessing them
echo %prev not properly reported by pdir
elseiff direxist %curr then
:: directory removed from the ftp site
rmdir /sq %curr
echo remove dir %curr
elseiff exist %curr then
:: file removed from the ftp site
del /q %curr
echo delete file %curr
else
:: should have transferred this file
iff isdir %ftp .and. %@files[%ftp,-d] == 0 then
:: empty directories are not transferred
mkdir %curr
else
echo %curr not received
endiff
endiff
endiff
endiff
set prev=%line
enddo
iftp /c
:: clean up
del /q %f1 %f2