; To actually use and distribute this code as an install program, then either each
; user must have WinBatch installed on their PC, or the WBT file must be compiled
; with the Winbatch Compiler.   This sample provided for evaluation only




a1="This is a sample wbt file that shows how to code an install program in WinBatch."
a2="In this code, the 'FileCopy' statements that would do the actual install"
a3="have been commented out, so that you can run this sample to see what a "
a4="Winbatch-based install program might look like without really copying any"
a5="files at all."
a6="It will make a Program Manager group to demo the ability to manage Program "
a7="Manager (or other shell) icons.  Just delete the group after the demo."

a1=strcat(a1,@crlf,@crlf,a2,@crlf,a3,@crlf,a4,@crlf,a5,@crlf,@crlf,a6,@crlf,a7,@crlf)

Message("Install-O-Batch",a1)


;Install-o-Batch
;A Winbatch software installer
;this wbt file is designed to be compiled and
;run off of a floppy disk

; Who am us anyways
InstallName="Acme Knickerbockers, Inc."

; Specify default destination directory
DestDir="C:\ACMEAPP\"      ; <<< We need and assume trailing \'s
SrcDir="A:\"                   ; <<< Ditto

; Specify files to install.  Start at file 1.  No skips in numbers
File1="potatoe.fry"       ; CHOOSE FILE 0 so that it HAS AN EXTENSION ( 'fry'  in this case )
file2="Carrot.cak"
file3="Peas.pod"
file4="cornbeef.cab"
file5="toast.jam"
file6="readme"


; Now we get busy

gosub SetupSplash

WhereWe=DirGet()


gosub VerifySrcDir

gosub VerifyDestDir

; Figure out how many files we have for user display
for filenum=1 to 1000
   if !IsDefined(File%filenum%) then break   ; all doned
next

filenum=filenum-1

for i=1 to filenum
   src=strupper(strcat(SrcDir,File%i%))
   dst=strupper(strcat(DestDir,File%i%))
   BoxText(strcat("Installing file ",i," of ",filenum,@crlf,@crlf,"Copying",@crlf,@tab,src,@crlf,"To",@crlf,@tab,dst))
   ; FileCopy(src,dst,0)          ; the commented out FileCopy
   Delay(Random(6)+1)             ; Fake delay to simulate FileCopy
next

; Set up program group now
; Use the handy progman.wil file

File1="Clock.exe"
File2="Calc.Exe"

Call("progman.wil","AddGroup '%InstallName%'")
Call("progman.wil","AddIcon '%InstallName%' '%File1%' 'Acme Clock'")
Call("progman.wil","AddIcon '%InstallName%' '%File2%' 'Acme Calculator'")
if WinExist("Program Manager") then WinIconize("Program Manager")


Message(InstallName,"Install Complete")

gosub UnSplash

exit

:Cancel
Gosub Unsplash
exit

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SetupSplash iconizes all windows, remembers current wallpaper
; and installs our wallpaper
:setupsplash
OrigWallpaperName=WinparmGet(10)
OrigWallpaperTile=IniRead("Desktop","TileWallpaper",0)
WallPaper("splash.bmp",1 )
OrigWindowList=WinItemize()   ;Get list of all open Windows
OrigWindowCount=ItemCount(OrigWindowList,@tab)
for i=1 to OrigWindowCount
    a=ItemExtract(i,OrigWindowList,@tab)
    b = WinState(a)
    OrigWindowState%i% = b
    ; Note we could hide the other windows here, but if the install
    ; bombs kind of bad, it leaves the user in a lurch and they
    ; got to reboot.  Bad news.  With icons they can always recover
    ; by themselves.
    if b!=@HIDDEN && b!=@ICON then WinIconize(a)
next
WinPlaceSet(@NORMAL,"","300 20 700 220")
BoxOpen(InstallName,"Install Initializing.  Please wait")

return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;UnSplash undoes Setup Splash
:UnSplash
ErrorMode(@off)
for i= OrigWindowCount to 1 by -1
    a=ItemExtract(i,OrigWindowList,@tab)
     switch OrigWindowState%i%
        case @HIDDEN
           break
        case @NORMAL
           WinShow(a)
           break
        case @ICON
           break
        case @ZOOMED
           WinZoom(a)
           break
     end switch
next
ErrorMode(@cancel)
WallPaper(OrigWallPaperName,OrigWallpaperTile)
return;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
:VerifyDestDir

BoxText("Verifying Destination Directory")

TryDest=strupper(AskLine(InstallName,"Enter destination directory or accept default",DestDir))

;Make sure there is a \ on the end
a=strsub(TryDest,strlen(TryDest),1)
if a!="\" then TryDest=strcat(TryDest,"\")

;If it exists, go home
if DirExist(TryDest)
   DestDir=TryDest
   return
endif


; Is user real sure?
a=AskYesNo("InstallName",strcat("Directory ",TryDest,@crlf,"Does not exist.  Create Directory?"))
if a==@NO then goto VerifyDestDir

; We have to chop up the directory name and insure each part exists
; and if not, create them one at a time.

Count=1
WorkDir=TryDest
While @TRUE
   a=strsub(WorkDir,1,strlen(WorkDir)-1)
   DirPart%Count%=FileRoot(a)
   ;Did unbelievable user specify an extension for the directory???
   b=FileExtension(a)
   if b!="" then DirPath%Count% = strcat(DirPart%Count%,".",b)
   WorkDir=FilePath(a)
   if strlen(WorkDir)<=3 then break
   Count=Count+1
endwhile

; got all the pieces now, build the directory

for i=Count to 1 by -1
   if !DirExist(WorkDir) then DirMake(WorkDir)
   WorkDir=strcat(WorkDir,DirPart%i%,"\")
next

;Make final piece
DirMake(WorkDir)

DestDir=TryDest
Return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
:VerifySrcDir

BoxText("Verifying Source Directory")

Delay(1)                       ; remove for production version
return                         ; remove for production version

SrcDir=DirGet()                ; Get current directory.
b=strcat(SrcDir,file1)         ; Get file name of first file

while !FileExist(b)
   d=strupper(File1)
   BoxText("Please select file %d% in source directory%@CRLF%to assist Install-O-Batch in locating source directory.")
   b=strcat("*.",FileExtension(d))
   a=AskFileName("Please locate %d%","","%b%|%b%|",b,1)
   SrcDir=FilePath(a)
   b=strcat(SrcDir,file1)       ; Get file name of first file
endwhile

return
































