Re: Input on CleanUp script
From: name (nospam_at_user.com)
Date: 10/16/04
- Previous message: Dave Anderson: "Re: Remove Carriage Returns"
- In reply to: Egil Hansen: "Input on CleanUp script"
- Next in thread: Egil Hansen: "Re: Input on CleanUp script"
- Reply: Egil Hansen: "Re: Input on CleanUp script"
- Messages sorted by: [ date ] [ thread ]
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();
> }
> }
> }
- Previous message: Dave Anderson: "Re: Remove Carriage Returns"
- In reply to: Egil Hansen: "Input on CleanUp script"
- Next in thread: Egil Hansen: "Re: Input on CleanUp script"
- Reply: Egil Hansen: "Re: Input on CleanUp script"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|