i'm receiving following error when run .vbs:
script: c:\users\me\desktop\delete.vbs
line: 21
char: 1
error: invalid procedure call or argument
code: 800a0005
source: microsoft vbscript runtime error
here code.
set objfso = createobject("scripting.filesystemobject") set objfolder = objfso.getfolder("c:\users\plex\downloads\completed\") intfoldersize = int(((objfolder.size / 1024) / 1024) / 1024) while intfoldersize >= 79 stroldestfile = "" dtmoldestdate = set colfiles = objfolder.files each objfile in colfiles strfile = objfile.path dtmfiledate = objfile.datecreated if dtmfiledate < dtmoldestdate dtmoldestdate = dtmfiledate stroldestfile = strfile end if next objfso.deletefile(stroldestfile) intfoldersize = int(((objfolder.size / 1024) / 1024) / 1024) loop
the error on line objfso.deletefile(stroldestfile)
.
could tell me why, , how fix it?
stroldestfile
seems string of 0 length initialized in stroldestfile = ""
statement.
for files, returns size, in bytes, of specified file. folders, returns size, in bytes, of files , subfolders contained in folder.
object.size
the
object
file or folder object
you either iterate files in subfolders or end loop follows:
if stroldestfile = "" wscript.echo "no file delete" intfoldersize = 0 ' end loop ' or recurse subfolders ' or choose strategy @ else objfso.deletefile(stroldestfile) intfoldersize = int(((objfolder.size / 1024) / 1024) / 1024) end if
next script should work:
option explicit on error goto 0 dim strresult: strresult = wscript.scriptname dim objfso, stroldestfile, dtmoldestdate, strfolder, ofolder, intfoldersize set objfso = createobject("scripting.filesystemobject") dtmoldestdate = strfolder = "c:\users\plex\downloads\completed\" stroldestfile = "" set ofolder = objfso.getfolder( strfolder) intfoldersize = int(((ofolder.size / 1024) / 1024) / 1024) 'do while intfoldersize >= 79 stroldestfile = "" dtmoldestdate = findoldestfile ofolder 'objfso.deletefile(stroldestfile) strresult = strresult & vbnewline & dtmoldestdate & vbtab & stroldestfile intfoldersize = int(((ofolder.size / 1024) / 1024) / 1024) 'loop wscript.echo strresult wscript.quit sub findoldestfile( objfolder) dim objfile, colfiles, colfolders, strfile, dtmfiledate ' find oldest file set colfiles = objfolder.files each objfile in colfiles strfile = objfile.path dtmfiledate = objfile.datecreated if dtmfiledate < dtmoldestdate dtmoldestdate = dtmfiledate stroldestfile = strfile end if next ' recurse subfolders set colfolders = objfolder.subfolders each objfile in colfolders findoldestfile objfile next end sub
note there commands commented debugging purposes (do while
, loop
, deletefile
); oldest file echo
ed instead.
above code not optimized in sense; maybe better be, avoid rereading filesystem attributes repeatedly:
- create array of file paths , dates , sizes,
- sort order such array dates, , then
- delete files summing deleted size…
edit: full code basic error handling
option explicit on error goto 0 dim strresult: strresult = wscript.scriptname dim objfso, dtmoldestdate, strfolder, ofolder, intfoldersize dim ii, intsizetodele, arraux, arrfilessorted, arrfilesunsort() ii = -1 strfolder = "d:\test" ' "c:\users\plex\downloads\completed\" dtmoldestdate = set objfso = createobject("scripting.filesystemobject") set ofolder = objfso.getfolder( strfolder) findallfiles ofolder arrfilessorted = bubblesort(arrfilesunsort,"") intfoldersize = ofolder.size intsizetodele = int(intfoldersize / 50) ' redefine match need strresult = strresult & vbtab & ii _ & vbtab & intsizetodele & vbtab & intfoldersize ii = 0 ubound( arrfilessorted) arraux = split( arrfilessorted( ii), "|") strresult = strresult & vbnewline & ii _ & vbtab & arraux(0) _ & vbtab & arraux(1) _ & vbtab & arraux(2) on error resume next ' basic error handling - start ''''' objfso.deletefile(arraux(2)) ' uncomment no sooner debugged if err.number = 0 else strresult = strresult & vbnewline & ii _ & vbtab & cstr(err.number) & " (0x" & hex(err.number) & ") " & err.description end if on error goto 0 ' basic error handling - end intsizetodele = intsizetodele - arraux(1) if intsizetodele <= 0 exit next strresult = strresult & vbnewline & ii _ & vbtab & intsizetodele & vbtab & intfoldersize wscript.echo strresult wscript.quit sub findallfiles( objfolder) dim objfile, colfiles, colfolders ' find files set colfiles = objfolder.files each objfile in colfiles ii = ii + 1 redim preserve arrfilesunsort(ii) arrfilesunsort(ii) = timestamp( objfile.datecreated) & "|" & objfile.size & "|" & objfile.path next ' recurse subfolders set colfolders = objfolder.subfolders each objfile in colfolders findallfiles objfile next end sub function bubblesort(byval arrdata,strsort) 'based on http://vbscripter.blogspot.cz/2008/03/q-how-do-i-sort-data-in-array.html 'input: arrdata = array of data. text or numbers. 'input: strsort = sort direction (asc or ascending or desc descending) 'output: array ' dim i, j, tempvalue if not trim(ucase(strsort)) = "desc" strsort = "asc" if strsort = "asc" = 0 ubound(arrdata) j = 0 ubound(arrdata) - 1 if arrdata(j) > arrdata(j+1) tempvalue = arrdata(j+1) arrdata(j+1) = arrdata(j) arrdata(j) = tempvalue end if next next else = 0 ubound(arrdata) j = 0 ubound(arrdata) - 1 if arrdata(j) < arrdata(j+1) tempvalue = arrdata(j+1) arrdata(j+1) = arrdata(j) arrdata(j) = tempvalue end if next next end if bubblesort = arrdata end function function timestamp( tt) 'input: tt = date (a variant of subtype date) 'output: sortable, fixed-length string: date formatted yyyymmddhhmmss timestamp = cstr( year (tt) & _ right("0" & month (tt),2) & _ right("0" & day (tt),2) & _ right("0" & hour (tt),2) & _ right("0" & minute(tt),2) & _ right("0" & second(tt),2)) end function
Comments
Post a Comment