Re: Input on CleanUp script

From: name (nospam_at_user.com)
Date: 10/16/04

  • Next message: name: "Re: Apply "alt-D" from withhin a DOS script"
    Date: Sat, 16 Oct 2004 03:22:56 -0400
    
    

    If this post does not make sense, just remember that you can not delete
    from info gathered via CREATED/LASTMODIFIED, because
    you will likely have former postdating later, that is because e.g. [same
    file]
    a restored backup on Jan04 has CREATED Jan04, but a LASTMODIFIED
    from Jul03 will still have a Jan04 created.
    In short write a log first, and decide on it.
    Read your delete material documentation 'node' in and then.
    And cross fingers you have a backup.

    If you don't care, just exclude one folder from precaution.
    That will be the one you lose over time , GUARANTEED.

    "Egil Hansen" <egil@dailyrush.dk> wrote in message
    news:ODUV9MqsEHA.3984@TK2MSFTNGP09.phx.gbl...
    > Hi all
    >
    > I'm quite inexperienced with WSH, but I've managed to write a script
    > that seem to work as its suppose . But I would really like some
    > feedback on it, from some of you guys with lots of experience. I've made
    > quite a few comments in the code, so it should be understandable.
    >
    > The scripts job is to search through a folder, and find all files that
    > are older then a XX days (e.g. haven't been modified/created for XX
    > days), and delete them. It should also remove all empty subfolders.
    >
    > Since I'm going to be using this script in a production environment, I'm
    > going to need logging, which the script also supports, and I've included
    > support for backup as well. If the script is used with a backup folder
    > specified, files selected for deletion, will be moved to that folder
    > instead.
    >
    > I ran in to a few problems with the backup support. I need to recreate
    > the directory structure from the original folder in the backup folder,
    > which turned out to be more difficult to do then I initially thought. I
    > ended up chickening out, and calling "XCOPY <target> <dest> /T /Y" from
    > the script, which simply makes a copy of the directory structure, but I
    > don’t really like that solution (any good ideas anybody?).
    >
    > In the first ~110 lines I mostly check the input given to the script.
    > Rest should be more interesting.
    >
    > Here’s the script (I have attached the script file to this mail as well,
    > may be easiere to read then):
    >
    > Best regards, Egil Hansen.
    >
    > -----------------------------------------------------------------------
    > /*
    > * CleanUp
    > *
    > * Description: This script will search a specified folder for files
    > * that have not been modified/created for xx days and delete them
    > (with/without backup).
    > * It will also delete empty folders.
    > *
    > * Version: 0.03
    > * By: Egil Hansen
    > *
    > * Errorcodes returned by this script:
    > * 1 = The target folder does not exist.
    > * 2 = Invalid input.
    > * 3 = Could NOT create backup folder.
    > *
    > *
    > * Changelog:
    > *
    > * Version 0.03
    > * - Files and folders objects are now added to a array and deleted
    > after the iteration of
    > * target folder.
    > *
    > *
    > *
    > */
    >
    > // Declaring variables
    > var fso, targetFolder, backupFolder, deleteDays, cd, useBackup;
    > var strTargetFolder, strBackupFolder, args0, args1, args2, noArgs;
    > var fileCounter = 0, folderCounter = 0;
    > var arrayFiles = new Array();
    > var arrayFolders = new Array();
    >
    > // Testing for required/valid arguments and assigning...
    > noArgs = new String(" CleanUp.js requires the following
    > arguments:\n\nTarget folder:\t\t\t/path:<folder>\nDelete
    > days:\t\t\t/days:<number of
    > days>\nLogfile:\t\t\t/logfile:<logfile>\nOptional - Backup
    > folder:\t/backup:<folder>\n\nExample:\n\tWithout backup:\tCleanUp.js
    > /path:c:\\public_share /days:14 /logfile:c:\\logfile.txt\n\tWith
    > backup:\tCleanUp.js /path:c:\\public_share /days:14
    > /logfile:c:\\logfile.txt /backup:c:\\backup\n\nTip:\n\tUse Cscript to
    > run the script instead of Wscript.\nExample:\n\tCscript CleanUp.js
    > /path:c:\\public_share /days:14 /logfile:c:\\logfile.txt
    > /backup:c:\\backup");
    >
    > if(WScript.Arguments.length == 0){
    > WScript.Echo(noArgs);
    > WScript.Quit();
    > }
    >
    > if(WScript.Arguments.Named.Exists("path")){
    > args0 = WScript.Arguments.Named.Item("path"); // "d:\\test";
    > }else{
    > WScript.Echo(" No folder specified for cleaning.");
    > WScript.Quit(2);
    > }
    >
    > if(WScript.Arguments.Named.Exists("days")){
    > args2 = parseInt(new String(WScript.Arguments.Named.Item("days")));
    > if(args2 <= 0){
    > WScript.Echo("No such deleteday. Use a number above 0 (zero): " + args2);
    > //WScript.Echo(noArgs);
    > WScript.Quit(2);
    > }
    > }else{
    > WScript.Echo("No deleteday defined. Use /days:<number> to define a
    > deleteday.");
    > //WScript.Echo(noArgs);
    > WScript.Quit(2);
    > }
    >
    > if(WScript.Arguments.Named.Exists("logfile")){
    > logfile = WScript.Arguments.Named.Item("logfile");
    > }else{
    > WScript.Echo("No log file specified...");
    > WScript.Quit(2);
    > }
    >
    > if(WScript.Arguments.Named.Exists("backup")){
    > args1 = new String(WScript.Arguments.Named.Item("backup"));
    > useBackup = true;
    > }else{
    > useBackup = false;
    > }
    >
    > // Instantiating objects and assigning values to variables
    > fso = new ActiveXObject("Scripting.FileSystemObject");
    > wsh = WScript.CreateObject("Wscript.Shell");
    >
    > deleteDays = 1000*60*60*24*args2; // Deletedays in milli secs.
    >
    > // Does the target folder exist?
    > if(fso.FolderExists(args0)){
    > targetFolder = fso.GetFolder(args0);
    > }else{
    > WScript.Echo("The target folder doesnt exist: "+args0);
    > WScript.Quit(1);
    > }
    >
    > // Backup active - connects to the backup folder / creates backup folder
    > and folder structure if nessesary...
    > if(useBackup == true){
    > var tmp;
    > if(fso.FolderExists(args1)){
    > backupFolder = fso.GetFolder(args1);
    >
    > }else{
    > try {
    > backupFolder = fso.CreateFolder(args1);
    > }catch(e){
    > WScript.Echo("Could NOT create backup folder: "+args1);
    > WScript.Quit(3); // >>>>> ABORTING SCRIPT >>>>>
    > }
    > }
    > tmp = "xcopy " + targetFolder + " " +backupFolder + " /T /Y";
    > wsh.Run(tmp, 0, true);
    > strTargetFolder = new String(targetFolder);
    > strBackupFolder = new String(backupFolder);
    > }
    >
    > // Starts logging...
    > var lf, logfile;
    > var ForReading = 1, ForWriting = 2, ForAppending = 8;
    > var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
    >
    > if(!fso.FileExists(logfile)){
    > fso.CreateTextFile(logfile);
    > logfile = fso.GetFile(logfile);
    > }
    > else{
    > logfile = fso.GetFile(logfile);
    > }
    >
    > lf = logfile.OpenAsTextStream(ForAppending, TristateUseDefault);
    > lf.WriteLine("---------------------------------");
    > lf.WriteLine("Starting CleanUp.js version 0.02:");
    > lf.WriteLine(new Date);
    > lf.WriteLine();
    > lf.WriteLine("Target path ...: "+args0);
    > lf.WriteLine("Deletedays ....: "+args2);
    > lf.WriteLine("Backup ........: "+useBackup);
    > lf.WriteLine("Backup folder .: "+args1);
    > lf.WriteLine("Logfile .......: "+logfile);
    > lf.WriteLine();
    > lf.WriteLine();
    >
    > // Executes the cleanup!!!
    > ScanFolders(targetFolder);
    > DeleteFolders();
    >
    > lf.WriteLine();
    > lf.WriteLine();
    > lf.WriteLine("Finished running CleanUp.js:");
    > lf.WriteLine("A total of "+fileCounter+" file(s) was deleted/moved.");
    > lf.WriteLine("A total of "+folderCounter+" folders(s) was deleted.");
    > lf.WriteLine(new Date);
    > lf.WriteLine("---------------------------------");
    > lf.Write("\n\n\n");
    > lf.Close();
    >
    > /*
    > * Finds sub folders and recurse on them and executes CleanUpFolder...
    > */
    > function ScanFolders(f){
    > var fc, tmp;
    > // Cleans up the current folder for old files...
    > CleanUpFolder(f);
    > // Deletes files marked for deletion
    > DeleteFiles();
    > // Is this folder empty? If not, look for subfolders...
    > if(f.SubFolders.Count != 0){
    > fc = new Enumerator(f.SubFolders);
    > for (;!fc.atEnd(); fc.moveNext()){
    > tmp = fso.GetFolder(fc.item());
    > ScanFolders(tmp);
    > }
    > }
    > // Test if folder should be deleted. If the size of the folder
    > // is == 0, then the folder neither contains subfolders or files.
    > if(f.Size == 0 && f != targetFolder){
    > arrayFolders.push(f);
    > }
    > }
    >
    > /*
    > * CleanUpFolder runs through every file in a specific folder (specified
    > with an argument)
    > * and either deletes or moves the files to the designated backup
    > folder, that meet the deletedays criteria.
    > */
    > function CleanUpFolder(fold){
    > var f, dlm, dd, dc, tmp;
    > f = new Enumerator(fold.Files);
    > for (;!f.atEnd();f.moveNext())
    > {
    > tmp = f.item();
    > // Date Last Modified
    > dlm = new Date(tmp.DateLastModified);
    > // Date Created
    > dc = new Date(tmp.DateCreated);
    > /*
    > * Getting the current time at each run, to make sure that
    > * files modified during script run doesnt end up being deleted
    > * becouse of a negative comparison...
    > */
    > cd = new Date();
    > dd = (cd.getTime()-deleteDays);
    > if(dc.getTime()<dd && dlm.getTime()<dd){
    > arrayFiles.push(tmp);
    > }
    > }
    > }
    >
    > function DeleteFiles(){
    > WScript.Echo("files");
    >
    > // Iterate through arrayFiles if > 0 and delete or move files.
    > if(arrayFiles.length > 0){
    > while(arrayFiles.length != 0){
    > var tmp;
    > tmp = arrayFiles.shift();
    > // Either delete files or move according to usebackup setting...
    > if(useBackup == true){
    > var destTmp, strBackTarget;
    > strBackTarget = new String(tmp);
    > destTmp = strBackTarget.replace(strTargetFolder, strBackupFolder);
    > // if the file aldready exists in the backup dir, then delete and
    > move the new from the public share...
    > if(fso.FileExists(destTmp)){
    > fso.DeleteFile(destTmp, true);
    > WScript.Echo(tmp+" Replaced file in backup folder.\n\tModified:
    > "+tmp.DateLastModified+"\n\tCreated: "+new Date(tmp.DateCreated));
    > lf.WriteLine("Moving file (R): " + tmp);
    > fileCounter++;
    > fso.MoveFile(tmp, destTmp);
    > }else{
    > WScript.Echo(tmp+"\n\tModified:
    > "+tmp.DateLastModified+"\n\tCreated: "+new Date(tmp.DateCreated));
    > lf.WriteLine("Moving file ..........: " + tmp);
    > fileCounter++;
    > fso.MoveFile(tmp, destTmp);
    > }
    > }
    > else{
    > lf.WriteLine("Deleting file ........: " + tmp);
    > fileCounter++;
    > fso.DeleteFile(tmp, true);
    > }
    > }
    > }
    > }
    >
    > function DeleteFolders(){
    > WScript.Echo("Folders");
    > // Iterate through arrayFolders if > 0 and delete folders.
    > if(arrayFolders.length > 0){
    > for(var i = 0; i < arrayFolders.length; i++){
    > var f;
    > f = arrayFolders[i];
    > WScript.Echo("Folder deleted .......: " + f);
    > lf.WriteLine("Folder deleted .......: " + f);
    > folderCounter++;
    > f.Delete();
    > }
    > }
    > }
    >
    >
    > --------------------------------------------------------------------------
    > EOF
    >
    >
    >
    >
    >
    >

    ----------------------------------------------------------------------------

    ----
    > /*
    >  * CleanUp
    >  *
    >  * Description: This script will search a specified folder for files
    >  * that have not been modified/created for xx days and delete them
    (with/without backup).
    >  * It will also delete empty folders.
    >  *
    >  * Version: 0.03
    >  * By: Egil Hansen
    >  *
    >  * Errorcodes returned by this script:
    >  * 1 = The target folder does not exist.
    >  * 2 = Invalid input.
    >  *  3 = Could NOT create backup folder.
    >  *
    >  *
    >  * Changelog:
    >  *
    >  * Version 0.03
    >  * - Files and folders objects are now added to a array and deleted after
    the iteration of
    >  *   target folder.
    >  *
    >  *
    >  *
    >  */
    >
    > // Declaring variables
    > var fso, targetFolder, backupFolder, deleteDays, cd, useBackup;
    > var strTargetFolder, strBackupFolder, args0, args1, args2, noArgs;
    > var fileCounter = 0, folderCounter = 0;
    > var arrayFiles = new Array();
    > var arrayFolders = new Array();
    >
    > // Testing for required/valid arguments and assigning...
    > noArgs = new String("   CleanUp.js requires the following
    arguments:\n\nTarget folder:\t\t\t/path:<folder>\nDelete
    days:\t\t\t/days:<number of
    days>\nLogfile:\t\t\t/logfile:<logfile>\nOptional - Backup
    folder:\t/backup:<folder>\n\nExample:\n\tWithout backup:\tCleanUp.js
    /path:c:\\public_share /days:14 /logfile:c:\\logfile.txt\n\tWith
    backup:\tCleanUp.js /path:c:\\public_share /days:14 /logfile:c:\\logfile.txt
    /backup:c:\\backup\n\nTip:\n\tUse Cscript to run the script instead of
    Wscript.\nExample:\n\tCscript CleanUp.js /path:c:\\public_share /days:14
    /logfile:c:\\logfile.txt /backup:c:\\backup");
    >
    > if(WScript.Arguments.length == 0){
    > WScript.Echo(noArgs);
    > WScript.Quit();
    > }
    >
    > if(WScript.Arguments.Named.Exists("path")){
    > args0 = WScript.Arguments.Named.Item("path"); // "d:\\test";
    > }else{
    > WScript.Echo("  No folder specified for cleaning.");
    > WScript.Quit(2);
    > }
    >
    > if(WScript.Arguments.Named.Exists("days")){
    > args2 = parseInt(new String(WScript.Arguments.Named.Item("days")));
    > if(args2 <= 0){
    > WScript.Echo("No such deleteday. Use a number above 0 (zero): " + args2);
    > //WScript.Echo(noArgs);
    > WScript.Quit(2);
    > }
    > }else{
    > WScript.Echo("No deleteday defined. Use /days:<number> to define a
    deleteday.");
    > //WScript.Echo(noArgs);
    > WScript.Quit(2);
    > }
    >
    > if(WScript.Arguments.Named.Exists("logfile")){
    > logfile = WScript.Arguments.Named.Item("logfile");
    > }else{
    > WScript.Echo("No log file specified...");
    > WScript.Quit(2);
    > }
    >
    > if(WScript.Arguments.Named.Exists("backup")){
    > args1 = new String(WScript.Arguments.Named.Item("backup"));
    > useBackup = true;
    > }else{
    > useBackup = false;
    > }
    >
    > // Instantiating objects and assigning values to variables
    > fso = new ActiveXObject("Scripting.FileSystemObject");
    > wsh = WScript.CreateObject("Wscript.Shell");
    >
    > deleteDays = 1000*60*60*24*args2; // Deletedays in milli secs.
    >
    > // Does the target folder exist?
    > if(fso.FolderExists(args0)){
    > targetFolder = fso.GetFolder(args0);
    > }else{
    > WScript.Echo("The target folder doesnt exist: "+args0);
    > WScript.Quit(1);
    > }
    >
    > // Backup active - connects to the backup folder / creates backup folder
    and folder structure if nessesary...
    > if(useBackup == true){
    > var tmp;
    > if(fso.FolderExists(args1)){
    > backupFolder = fso.GetFolder(args1);
    >
    > }else{
    > try {
    > backupFolder = fso.CreateFolder(args1);
    > }catch(e){
    > WScript.Echo("Could NOT create backup folder: "+args1);
    > WScript.Quit(3); // >>>>> ABORTING SCRIPT >>>>>
    > }
    > }
    > tmp = "xcopy " + targetFolder + " " +backupFolder + " /T /Y";
    > wsh.Run(tmp, 0, true);
    > strTargetFolder = new String(targetFolder);
    > strBackupFolder = new String(backupFolder);
    > }
    >
    > // Starts logging...
    > var lf, logfile;
    > var ForReading = 1, ForWriting = 2, ForAppending = 8;
    > var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
    >
    > if(!fso.FileExists(logfile)){
    > fso.CreateTextFile(logfile);
    > logfile = fso.GetFile(logfile);
    > }
    > else{
    > logfile = fso.GetFile(logfile);
    > }
    >
    > lf = logfile.OpenAsTextStream(ForAppending, TristateUseDefault);
    > lf.WriteLine("---------------------------------");
    > lf.WriteLine("Starting CleanUp.js version 0.02:");
    > lf.WriteLine(new Date);
    > lf.WriteLine();
    > lf.WriteLine("Target path ...: "+args0);
    > lf.WriteLine("Deletedays ....: "+args2);
    > lf.WriteLine("Backup ........: "+useBackup);
    > lf.WriteLine("Backup folder .: "+args1);
    > lf.WriteLine("Logfile .......: "+logfile);
    > lf.WriteLine();
    > lf.WriteLine();
    >
    > // Executes the cleanup!!!
    > ScanFolders(targetFolder);
    > DeleteFolders();
    >
    > lf.WriteLine();
    > lf.WriteLine();
    > lf.WriteLine("Finished running CleanUp.js:");
    > lf.WriteLine("A total of "+fileCounter+" file(s) was deleted/moved.");
    > lf.WriteLine("A total of "+folderCounter+" folders(s) was deleted.");
    > lf.WriteLine(new Date);
    > lf.WriteLine("---------------------------------");
    > lf.Write("\n\n\n");
    > lf.Close();
    >
    > /*
    >  * Finds sub folders and recurse on them and executes CleanUpFolder...
    >  */
    > function ScanFolders(f){
    > var fc, tmp;
    > // Cleans up the current folder for old files...
    > CleanUpFolder(f);
    > // Deletes files marked for deletion
    > DeleteFiles();
    > // Is this folder empty? If not, look for subfolders...
    > if(f.SubFolders.Count != 0){
    > fc = new Enumerator(f.SubFolders);
    > for (;!fc.atEnd(); fc.moveNext()){
    > tmp = fso.GetFolder(fc.item());
    > ScanFolders(tmp);
    > }
    > }
    > // Test if folder should be deleted. If the size of the folder
    > // is == 0, then the folder neither contains subfolders or files.
    > if(f.Size == 0 && f != targetFolder){
    > arrayFolders.push(f);
    > }
    > }
    >
    > /*
    >  * CleanUpFolder runs through every file in a specific folder (specified
    with an argument)
    >  * and either deletes or moves the files to the designated backup folder,
    that meet the deletedays criteria.
    >  */
    > function CleanUpFolder(fold){
    > var f, dlm, dd, dc, tmp;
    > f = new Enumerator(fold.Files);
    > for (;!f.atEnd();f.moveNext())
    > {
    > tmp = f.item();
    > // Date Last Modified
    > dlm = new Date(tmp.DateLastModified);
    > // Date Created
    > dc = new Date(tmp.DateCreated);
    > /*
    > * Getting the current time at each run, to make sure that
    > * files modified during script run doesnt end up being deleted
    > * becouse of a negative comparison...
    > */
    > cd = new Date();
    > dd = (cd.getTime()-deleteDays);
    > if(dc.getTime()<dd && dlm.getTime()<dd){
    > arrayFiles.push(tmp);
    > }
    > }
    > }
    >
    > function DeleteFiles(){
    > WScript.Echo("files");
    >
    > // Iterate through arrayFiles if > 0 and delete or move files.
    > if(arrayFiles.length > 0){
    > while(arrayFiles.length != 0){
    > var tmp;
    > tmp = arrayFiles.shift();
    > // Either delete files or move according to usebackup setting...
    > if(useBackup == true){
    > var destTmp, strBackTarget;
    > strBackTarget = new String(tmp);
    > destTmp = strBackTarget.replace(strTargetFolder, strBackupFolder);
    > // if the file aldready exists in the backup dir, then delete and move the
    new from the public share...
    > if(fso.FileExists(destTmp)){
    > fso.DeleteFile(destTmp, true);
    > WScript.Echo(tmp+" Replaced file in backup folder.\n\tModified:
    "+tmp.DateLastModified+"\n\tCreated: "+new Date(tmp.DateCreated));
    > lf.WriteLine("Moving file (R): " + tmp);
    > fileCounter++;
    > fso.MoveFile(tmp, destTmp);
    > }else{
    > WScript.Echo(tmp+"\n\tModified: "+tmp.DateLastModified+"\n\tCreated: "+new
    Date(tmp.DateCreated));
    > lf.WriteLine("Moving file ..........: " + tmp);
    > fileCounter++;
    > fso.MoveFile(tmp, destTmp);
    > }
    > }
    > else{
    > lf.WriteLine("Deleting file ........: " + tmp);
    > fileCounter++;
    > fso.DeleteFile(tmp, true);
    > }
    > }
    > }
    > }
    >
    > function DeleteFolders(){
    > WScript.Echo("Folders");
    > // Iterate through arrayFolders if > 0 and delete folders.
    > if(arrayFolders.length > 0){
    > for(var i = 0; i < arrayFolders.length; i++){
    > var f;
    > f = arrayFolders[i];
    > WScript.Echo("Folder deleted .......: " + f);
    > lf.WriteLine("Folder deleted .......: " + f);
    > folderCounter++;
    > f.Delete();
    > }
    > }
    > }
    

  • Next message: name: "Re: Apply "alt-D" from withhin a DOS script"

    Relevant Pages

    • Re: Input on CleanUp script
      ... And cross fingers you have a backup. ... just exclude one folder from precaution. ... > var fso, targetFolder, backupFolder, deleteDays, cd, useBackup; ... that meet the deletedays criteria. ...
      (microsoft.public.scripting.wsh)
    • Input on CleanUp script
      ... Since I'm going to be using this script in a production environment, ... If the script is used with a backup folder ... var strTargetFolder, strBackupFolder, args0, args1, args2, noArgs; ...
      (microsoft.public.scripting.jscript)
    • Input on CleanUp script
      ... Since I'm going to be using this script in a production environment, ... If the script is used with a backup folder ... var strTargetFolder, strBackupFolder, args0, args1, args2, noArgs; ...
      (microsoft.public.scripting.wsh)
    • Re: How to automate ASR restore process
      ... Setting up the RIS server to use ASR ... folder on the RIS server, ... make a backup copy of each .osc file before you ...
      (microsoft.public.windows.server.general)
    • Re: Backups HELP!
      ... One of your customer has encountered a backup issue on the SBS 2003 ... all child objects have inheritable permissions from the parent to propagate ... How to take ownership of a folder ... To take ownership of a folder, ...
      (microsoft.public.windows.server.sbs)

    Loading