, l'option -sortable formate la log en plaçant le nom de fichier à une colonne fixe, il est donc possible de le trier pour en faire un index (commande
'gaffe times modulo 24h!
' fair noreg
' faire nolist
' faire ????
' faire --root facultatif
' nousers
' 11 go en 300"
' 1/2 go minute
' 7 go en 1000": 700 mo en 100" 500 mo ': 500000*8=4 000 000 4 Mbits/s (réseau 100 Mbits!)
option explicit
dim relufile
dim nook
nook=true
dim start
start=-1
dim excludeusers
excludeusers=false
dim excludewindows
excludewindows=false
dim includewindows
includewindows=true
dim excludeprograms
excludeprograms=false
dim includeprograms
excludeprograms=true
dim sortable
sortable=false
dim profondeur
profondeur=0
dim verb
verb=" copy "
dim buffer
buffer=""
dim excludesystem
excludesystem=false
dim tab(257)
dim nolog
nolog=false
dim copy
copy=false
dim nocopy
nocopy=false
dim logname
logname=""
dim logfile
init
dim remdos
remdos=""
dim target
target=""
dim nbficop
nbficop=0
dim nbccop
nbccop=0
dim bat
bat=false ' vrai si -bat
' 2do: wscript and prameters
' executed by wscript or cscript ?
dim who, w
who= ucase(wscript.fullname)
if instr(who,"CSCRIPT")>0 then
w=false
elseif instr(who,"WSCRIPT")>0 then
w=true
else
wscript.echo "unknown handler "& who
wscript.quit
end if
dim version
version="http://antiguide.free.fr/wiki/wakka.php?wiki=cpw, 20230326 "
dim fs
set fs=createobject("scripting.filesystemobject")
dim count
count=wscript.arguments.count
dim gui
dim stdout
if w then
gui=true
' trop tot pour ouvrir fichier reultats don connaite pas encore son nom!
else
gui=false
Set stdout = fs.GetStandardStream (1)
'Set stderr = fs.GetStandardStream (2)
'msgbox "stdout not gui open "
end if ' gui
dim nberr
nberr=0
dim nbfiles
dim nbfolders
nbfolders=0
nbfiles=0
dim all
all=false
dim onlyfiles
onlyfiles=false
dim bsize
bsize=1
dim trailer
trailer="\"
dim bycluster
bycluster=false
dim lev
dim lonlev ' longueur de l'argument aà oter lors de copie
' wrlog "w:" & w & " count:"&count
if w then
if count=1 then
lev=wscript.arguments(0)
' lonlev=len(lev)
msgbox lev
else
lev=inputbox ("cpw " &vbcrlf & _
version & vbcrlf & _
"version du 20201228-1800" & vbcrlf & _
"entrez le chemin à explorer")
if len(lev)=0 then
msgbox "Oooops"
wscript.quit
end if
end if ' lev
dim out
dim where
where=fs.GetAbsolutePathName(".")
out=inputbox ( "cpw " &vbcrlf &_
version & vbcrlf & _
"Entrez le nom du fichier destinataire de la liste" & vbcrlf & _
"in: " & where &"\.")
if len(out)=0 then
msgbox "no out file"
wscript.quit
end if
out=fs.GetAbsolutePathName(".") &"\"&out
set stdout=fs.createtextfile(out)
' msgbox "ok creation " & out
wrlog remdos & "cpw ("&version&")"
wrlog remdos & "Started @ "&nono
else ' donc c pas windows
wrlog remdos & "cpw ("&version &")"
wrlog remdos & "Started @ "&nonow
dim ic
for ic=0 to count-1
dim opt
opt=ucase(wscript.arguments.item(ic))
wrlog remdos & "param: "& opt
if instr("-1-5-4-8-X-B",opt)>1 and bsize>1 then
wrlog "duplicated cluster-size option."
wscript.quit
end if
dim optcmd
dim optvalue
optcmd=opt
optvalue=""
if instr(opt,":")>0 then
optcmd=mid(opt,1,instr(opt,":")-1)
optvalue=mid(opt,instr(opt,":")+1)
end if
select case optcmd
case "-NOUSERS"
excludeusers=true
case "-CHRONO"
start=timer()
case "-NOWINDOWS"
excludewindows=true
case "-WINDOWSONLY"
includewindows=true
case "-NOPROGRAMS"
excludeprograms=true
case "-PROGRAMSONLY"
includeprograms=true
case "-SORTABLE"
sortable=true
case "-NOLOG"
nolog=true
case "-NOSYSTEM":
excludesystem=true
case "-LOG":
logname=optvalue
logname=fs.GetAbsolutePathName(logname)
set logfile=fs.createtextfile(logname)
logfile.writeline buffer
wrlog remdos & "log: """&logname&""""
buffer=""
case "-TARGET":
target=optvalue
target=fs.GetAbsolutePathName(target)
wrlog remdos & "target: """&target&""""
case "-BAT":
bat=true
REMDOS = "REM "
case "-TESTONLY":
nocopy=true
copy=true
verb= " test "
wrlog "param testonly:" & nocopy
case "-COPY":
copy=true
case "-I":
info( wscript.arguments.item(count-1))
wscript.quit
case "-C": bycluster=true
case "-1": bsize=1024
case "-5": bsize=512
case "-4": bsize=4096
case "-8": bsize=8192
case "-X": bsize=16384
case "-B": bsize=1
case "-A":
all=true
case "--HELP" :
wrlog " -b count in bytes"
wrlog " -i information about disk drive"
wrlog " -f list only files "
wrlog " -a list files and folders"
wrlog " -5 cluster of 512 bytes"
wrlog " -1 cluster of 1024 bytes"
wrlog " -2 cluster of 2048 bytes"
wrlog " -4 cluster of 4096 bytes"
wrlog " -8 cluster of 8192 bytes"
wrlog " -x cluster of 16384 bytes"
wrlog " -c display count in clusters"
wrlog " -nolog no log file"
wrlog " -log: log file"
wrlog " -sortable file name first "
wrlog " -copy copy folders and files (need target:)"
wrlog " -target: folder to create to receive copy"
wrlog " -testonly browse files but NO copy"
wrlog " -nosystem exclude files/forders with system attribute"
wrlog " -nowindows exclude ?:\windows folder"
wrlog " -noprograms exclude ""?:\program files"" and ""?:\program files (x86)"" folders"
wrlog " soon: -windowsonly copy windows folder"
wrlog " soon: -programsonly copy ""program files"" and ""program files (x86)"" folders"
wrlog " -chrono display elapsed ""."
wrlog " -clock display wall time"
wrlog " -nousers exclude ""?:\users"" and ""?\documents and settings"" folders"
wscript.quit
case "-F": onlyfiles=true
case else:
if ic<count-1 then
wrlog "unknown! "&opt
wscript.quit
end if
end select
if instr("-1-5-4-8-X-B",opt)>=1 then wrlog "Cluster-size set to " & bsize
next 'ic
if bsize>1 then wrlog "Cluster-size: " & bsize
if count=0 and not w then
wrlog "aide: cpw --help"
wscript.quit
end if
if w then
else
lev=wscript.arguments.item(count-1)
' oter le . final
if mid(lev,len(lev))="." then lev=mid(lev,1,len(lev)-1)
'lonlev=len(lev)
end if
end if
if bsize>1 then wrlog "cluster-size: "&bsize
if copy and (not nocopy) and len(target)=0 then
wrlog "copy needs target"
wscript.quit
end if
' fini les préparatifs
if bat then remdos="REM "
lev= fs.getabsolutepathname(lev)
wrlog remdos & "root: "&lev
lonlev=len(lev)
if lonlev>3 then lonlev=lonlev+1
dim x
dim xroot
dim fzero
set fzero=fs.getfolder(lev)
dim attribpp
attribpp=fzero.attributes
if BAT or copy and not nocopy then
target=fs.GetAbsolutePathName(target)
if not nook then wrlog "absolute target " & target & " copy:" & copy
if bat then wrlog "if not exist """&target& """ mkdir """&target&""""
if copy then
fs.createfolder target
if not nook then wrlog nonow& " (1) folder: ["&disp(attribpp)& "] """ & target&""""
else
wrlog nonow& " folder IGHNORED: ["&disp(attribpp)&"] """ & target&""""
end if
end if
'wrlog "ANDIAMO copy:" & copy
dim startnow
startnow=now
x=level(lev,attribpp)
if nberr>0 then wrlog "#errors: "&nberr
wrlog remdos & "#folders: "&nbfolders
wrlog remdos & "#files: "&nbfiles
wrlog remdos & "#files copied/tested: "&nbficop
wrlog remdos & "#bytes copied/tested: "&nbccop
' if not gui then stderr.writeline "Ended @ "&nonow
wrlog remdos & "Ended @ "&nonow&" ( started @ "&startnow& ")"
' ----- fin du PP
function level(p,attx)
if islink(attx) then
wrlog "LINK ignore "& p
exit function
end if
profondeur=profondeur+1
' BUG! if mid(p,len(p))="\" then p=mid(p,1,len(p)-1)
dim nberrfiles
nberrfiles=0
dim nberrfolders
nberrfolders=0
' wrlog remdos & "traite folder " & p
' wrlog "pour de bon " & p
dim s,smax
s=0 ' taile en byte
smax=0 'taille arrondie au cluster supérieur (selon taille indiquée, pas vérifié réelle)
on error resume next
dim fo
set fo=fs.getfolder(p)
dim attrx
attrx=fo.attributes
if err.number>0 then
wrerr "erreur "&err.number & " en lecture dossier: " & p
wrlog "ABANDON"
err.clear
on error goto 0
level=-1
exit function
end if
on error goto 0
dim fc, onefile, fsize, fmax, ffixe
on error resume next
Set fc = fo.Files
if err.number >0 then
wrlog "ERREUR 1 " & err.description& " en get files, dossier ABANDONNE"
err.clear
on error goto 0
exit function
end if
' wrlog "tester count fi"
dim nbfi
on error resume next
nbfi=fc.count
if err.number >0 then
wrlog "ERREUR 1 " & err.description& " en demandant le nombre de fichiers, dossier ABANDONNE"
err.clear
on error goto 0
exit function
end if
on error goto 0
' ici erreur si c;\.
on error resume next
' wrlog "nb files: "&fc.count
if err.number>0 then
wrerr "err 8 compte files indisponible"& err.number & " " & err.description
err.clear
on error goto 0
exit function
end if
on error goto 0
on error resume next
For Each onefile in fc
if err.number>0 then
wrerr "FILE illisible"
nberrfiles=nberrfiles+1
err.clear
on error goto 0
else
' wrlog "REM TRAITE FILE " &onefile.name
nbfiles=nbfiles+1
fsize=onefile.size
dim attribfi
attribfi=onefile.attributes
if islink(attribfi) then
wrlog "LINK ignore " & onefile.name
else
fmax=bsize*int((fsize+bsize-1)/bsize)
ffixe=fixe(fmax)
if sortable then
if all or onlyfiles then wrlog "REM FILE "& ffixe & " " &disp(attribfi) & " """ & onefile.name & """ " & """" & p & """ "
else
if all or onlyfiles then wrlog "REM FILE "& ffixe & " " &disp(attribfi) & " """ & p & """ """ & onefile.name & """"
end if
if bat or copy then
dim sourcefi
dim ciblefi
dim inter
inter=""
if mid(p,len(p))<>"\" then inter="\"
on error resume next
sourcefi= p & inter& onefile.name
if err.number >0 then
wrlog "ERREUR 1 " & err.description& " en .names, dossier ABANDONNE"
err.clear
on error goto 0
exit function
end if
' wrlog "sourcefi construit::::::" & sourcefi&":::::"
' if bat then sourcefi=""""&sourcefi&""""
' GAFFE +1 au pif
' wrlog "p::::::"& p&"::::lonlev:"&lonlev
ciblefi=target & mid(p,lonlev)
if bat then ciblefi=ciblefi &"\."
if copy then
' wrlog "ciblefi:::::"& ciblefi&"::::"
dim bis
bis=""
if mid(ciblefi,len(ciblefi))<>"\" then bis="\"
ciblefi=ciblefi &bis&onefile.name
' wrlog "ciblefi:"& ciblefi
end if
' if bat then ciblefi=""""&ciblefi&""""
dim w4
w4= verb & " """ & sourcefi & """ """ &ciblefi&""""
if bat then w4= w3dos(w4)
if bat then wrlog w4
if copy then
dim fautcopy
fautcopy=true
' wrlog "sourcefi:"&sourcefi
if excludeusers and debute(1,sourcefi,"users\") then fautcopy=false
if excludeusers and debute(1,sourcefi,"documents and settings\") then fautcopy=false
if excludewindows and debute(2,sourcefi,"windows\") then fautcopy=false
if excludeprograms and debute(3,sourcefi,"program files\") then fautcopy=false
if excludeprograms and debute(4,sourcefi,"program files (x86)\") then fautcopy=false
if excludesystem and issystem(attribfi) then fautcopy=false
nbficop=nbficop+1
nbccop=nbccop+fsize
if nocopy then fautcopy=false
'
if fautcopy then
if not nook then wrlog nonow & " [" & fsize & disp(attribfi)&"] " & w4
if not nook then wrlog "copy """&sourcefi& """ """&ciblefi&""""
on error resume next
fs.copyfile sourcefi,ciblefi
if err.number>0 then
wrerr "err 2 #:"& err.number & " description:" & err.description & " source:" & err.source
err.clear
end if
on error goto 0
else
if nocopy then
if not nook then wrlog nonow & " [" & fsize & disp(attribfi)&"] """ & sourcefi&""""
else
if not nook then wrlog nonow & " NO [" & fsize & disp(attribfi)&"] EXCLUDED " & w4
end if
end if
end if
fautcopy=true
if nocopy then fautcopy=false
if excludeusers and debute(6,sourcefi,"users\") then fautcopy=false
if excludeusers and debute(1,sourcefi,"documents and settings\") then fautcopy=false
if excludewindows and debute(7,sourcefi,"windows\") then fautcopy=false
if excludeprograms and debute(8,sourcefi,"program files\") then fautcopy=false
if excludeprograms and debute(9,sourcefi,"program files (x86)\") then fautcopy=false
if excludesystem and issystem(attribfi) then fautcopy=false
if fautcopy then
if not fs.fileexists(ciblefi) then
wrerr "err 5 fichier non copié :" &ciblefi
else
if attribfi>=0 then
on error resume next
set relufile=fs.getfile(ciblefi)
if err.number>0 then
wrerr "err 3 "& err.number & " " & err.description & " " & err.source
err.clear
end if
on error goto 0
relufile.attributes=attribfi
dim attribrelu
attribrelu=relufile.attributes
' wrlog "----"&disp(attribfi)&"----"&disp(attribrelu)
end if
end if
end if
end if
end if ' bat / copy
smax=smax+fmax
end if 'err ou au 'PIF end if ' islink
Next ' fc files
if nberrfiles>0 then
wrlog "REM # FICHIERS illisisbles " & nberrfiles & " dans " & p
' wscript.quit
end if
Set fc = fo.subFolders
dim nbfo
on error resume next
nbfo=fc.count
if err.number >0 then
wrlog "ERREUR 3 " & err.description& " en demandant le nombre de folders, dossier ABANDONNE"
err.clear
exit function
end if
on error goto 0
dim onefolder
on error resume next
For Each onefolder in fc
if err.number>0 then
wrerr "err 7 sous folder " & p
err.clear
on error goto 0
else
on error goto 0
dim attribfo
attribfo=onefolder.attributes
'wrlog "memo attribfo="&disp(attribfo)& " " & onefolder.name
nbfolders=nbfolders+1
dim f2, anti, p2
set f2=fs.getfolder(onefolder)
p2=f2.name
if bat or copy then
dim sourcefo
dim ciblefo
dim plus
plus=""
if mid(p,len(p))<>"\" then plus="\"
sourcefo="""" & p &plus &p2 & """"
' GAFFE bricolage en cours
ciblefo=""""&target & mid(p & "\" & p2,lonlev+1)&""""
' wrlog "REM lonlev:"&lonlev
' wrlog "REM p2==="&p2&"==="
' wrlog "REM sourcefo==="&sourcefo&"==="
if bat then wrlog "REM ciblefo==="&ciblefo&"==="
dim w2
dim w1
w1="if not exist " & ciblefo & " mkdir " & ciblefo
'wrlog "REM W1:" & w1
w2= w3dos(w1 )
'msgbox "bonjour" & len(w2)
if bat then wrlog w2
if copy then
dim ter
ter=""
if mid(p,len(p))<>"\" then ter="\"
' wrlog "REM p\p2==="&p & ter & p2&"==="
dim ouf
ouf=target & "\" & mid(p & ter & p2,lonlev+1)
if not nook then wrlog nonow& " " & profondeur & " ["&disp(attribfo)&"] folder: """ & ouf&""""
fautcopy=true
if nocopy then fautcopy=false
if excludeusers and debute(10,sourcefo,"users\") then fautcopy=false
if excludeusers and debute(1,sourcefi,"documents and settings\") then fautcopy=false
if excludewindows and debute(11,sourcefo,"windows\") then fautcopy=false
if excludeprograms and debute(12,sourcefo,"program files\") then fautcopy=false
if excludeprograms and debute(13,sourcefo,"program files (x86)\") then fautcopy=false
if excludesystem and issystem(attribfo) then fautcopy=false
if not nook then wrlog "create folder fautcopy:"&fautcopy&" excludesystem:"&excludesystem & " excludeusers:"& excludeusers& " " &disp(attribfo)& " " & sourcefo
'
if fautcopy then
on error resume next
fs.createfolder ouf
if err.number>0 then
wrlog "ERREUR: 4 " &err.number & ": " & err.description & " " & err.source
err.clear
on error goto 0
exit function
end if '>0
on error goto 0
' wrlog "getgfolder " &ouf
set onefolder=fs.getfolder(ouf)
onefolder.attributes=attribfo
end if ' not nocopy
end if ' copy
end if ' bat or copy
anti=""
if mid(p,len(p))<>"\" then anti="\"
' recursion
fsize=0
fautcopy=true
' wrlog "sourefo:::::"&sourcefo&":::::"
if excludeusers and debute(14,sourcefo,"users\") then fautcopy=false
if excludeusers and debute(1,sourcefi,"documents and settings\") then fautcopy=false
if excludewindows and debute(154,sourcefo,"windows\") then fautcopy=false
if excludeprograms and debute(16,sourcefo,"program files\") then fautcopy=false
if excludeprograms and debute(17,sourcefo,"program files (x86)\") then fautcopy=false
if excludesystem and issystem(attribfo) then fautcopy=false
' wrlog "explore foilder fautcopy:"&fautcopy&" excludesystem:"&excludesystem & " excludeusers:"& excludeusers& " " &disp(attribfo)& " " & sourcefo
if fautcopy then
fsize=level(p & anti& p2,attribfo)
if fsize=-1 then
wrlog "retour -1 attibfo:" & attribfo & " " &p & anti& p2
else
fmax=bsize*int((fsize+bsize-1)/bsize)
smax=smax+fmax
end if
else
wrlog "no more folder: """ & p & "\" & onefolder.name&""""
end if
end if ' ajoute 2211
Next ' fc folders
dim t1
t1=trailer
if mid(p,len(p))="\" then t1=""
if not onlyfiles then wrlog remdos & "FOLD " & fixe(smax) &" " & disp(attx) & " """ & p & t1 & """"
profondeur=profondeur-1
level=smax
end function
function fixe(n)
dim nn
if bycluster then
nn=int((n+bsize-1)/bsize)
else
nn=n
end if
dim f
f=" " & nn
fixe=mid(f,len(f)-14)
end function
sub info (l)
Set objdrive = fs.GetDrive(fs.GetDriveName(l))
wrlog "Available space: " & objDrive.AvailableSpace
wrlog "Drive letter: " & objDrive.DriveLetter
wrlog "Drive type: " & objDrive.DriveType
wrlog "File system: " & objDrive.FileSystem
wrlog "Free space: " & objDrive.FreeSpace
wrlog "Is ready: " & objDrive.IsReady
wrlog "Path: " & objDrive.Path
wrlog "Root folder: " & objDrive.RootFolder
wrlog "Serial number: " & objDrive.SerialNumber
wrlog "Share name: " & objDrive.ShareName
wrlog "Total size: " & objDrive.TotalSize
wrlog "Volume name: " & objDrive.VolumeName
end sub
function disp(nn)
dim n
n=nn
dim d
d=""
'd=" " & n & ":"
if n MOD 2 <> 0 then d=d &"/R"
n=int(n/2)
if n MOD 2 <> 0 then d=d & "/H"
n=int(n/2)
if n MOD 2 <> 0 then d=d & "/S"
n=int(n/2)
if n MOD 2 <> 0 then d=d & "/V"
n=int(n/2)
if n MOD 2 <> 0 then d=d & "/F"
n=int(n/2)
if n MOD 2 <> 0 then d=d & "/A"
n=int(n/2) '64
n=int(n/2) ' 128
n=int(n/2) ' 256
n=int(n/2) ' 512
n=int(n/2) '1024
if n MOD 2 <> 0 then d=d & "/L"
n=int(n/2) '2048
if n mod 2 <> 0 then d=d & "/C"
disp=d
end function
function issystem(nn)
issystem= instr(disp(nn),"/S")>0
end function
function islink(nn)
islink= instr(disp(nn),"/L")>0
end function
sub init
dim i
for i=0 to 127
tab(i)=chr(i)
next 'i
for i=128 to 255
tab(i)=chr(0)
next 'i
tab(233)=chr(130) ' "é"
tab(231)=chr(135) ' "ç"
tab(224)=chr(153)' "à"
tab(232)=chr(138)' "è"
tab(249)=chr(151) '"ù"
tab(226)=chr(131) '"â"
tab(234)=chr(136) '"ê"
end sub
function w3dos (jn)
if not bat then
w3dos=jn
exit function
end if
dim ot
ot=""
dim i
for i=1 to len(jn)
dim car
car=mid(jn,i,1)
dim ascii
ascii=asc(car)
' wrlog len(jn) & " " & i & " " & car & " add " & ascii & " " & tab(ascii)
dim traduit
traduit = tab(ascii)
if traduit=chr(0) then msgbox jn & vbcrlf & "ajouter "&car& " " & ascii
if ascii>127 then wrlog remdos & " traduit " & ascii & " " & car & ">" & traduit
ot=ot&traduit
next 'i
w3dos=ot
end function
function w4dos (jn)
w4dos=jn
return
' msgbox jn
dim ot
ot=""
dim i
for i=1 to len(jn)
dim car
car=mid(jn,i,1)
dim ascii
ascii=asc(car)
code = tab(ascii)
msgbox "decode " & ascii
if code=chr(0) then
msgbox jn & " TRADUIRE:" & cun & " " & asc(cun)
else
ot=ot & chr(code)
end if
next 'i
wrlog jn & " TRADUIT:" & jn
msgbox "ot:" & ot
w4dos=ot
end function
sub wrlog(t)
' exit sub
stdout.writeline t
if nolog then EXIT SUB
if len(logname)=0 then
buffer=buffer & vbcrlf & t
else
logfile.writeline t
end if
end sub
sub wrerr(t)
stdout.writeline "ERREUR " & t
if not nolog then exit sub
if len(logname)>0 then
logfile.writeline "ERREUR "& tt
else
buffer=buffer & vbcrlf & "ERreur " & t
end if
end sub
function nonow
dim n
n=now
'dim elapsed
'elapsed=timer()-start
dim et
et=timer()
if start>=0 then
nonow=FormatNumber(et - Start, 0)&""""
else
nonow=mid(n,7,4)&mid(n,4,2)&mid(n,1,2)&mid(n,11)
end if
end function
function debute(appel,meule,aiguille)
if len(meule)=0 then
debute=false
exit function
end if
'wrlog ucase(meule) & " " & ucase(aiguille) & " ==== " & instr(ucase(meule), ucase(aiguille))&" ok="&ok
dim ou
ou= instr(ucase(meule)&"\", ucase(aiguille)&"\")
'wrlog meule & " " & aiguille & " " & ou
debute= ou=4
end function