Thursday, September 11, 2014

du.js -- Disk Usage. List Files and Folders for a Directory on Windows

Problem

On Windows, you want to list files and folder similar to the du utility found on Linux/Unix systems.

Solution

Use du.js script:

/* 
*  du.js 
*  Print and calculate files and folders space usage for a given directory.
*  Size printed by default in bytes.
*  
*  Usage:
*  cscript.exe du.js [directory] [/bs:blockSize]
*
*  directory -- optional parameter of the directory to use. If omitted then current direcotry is used
*  blockSize -- optional parameter. Shows sizes in Kilobytes, Megabytes or Gigabytes.
*  Accepts values K, M or G for Kilobytes, Megabytes and Gigabytes respectively. 
*  If omitted the sizes are show in bytes. This is the default.
*
*
*/

String.prototype.rpad = function(len, char) {
 var str = this.toString();
 var deltaLen = len - str.length;
 for (i=0; i<deltaLen; i++) str = str.concat(char);
 return str;
}

var folderSpec;
if (WScript.Arguments.Unnamed.length > 0) {
 folderSpec = WScript.Arguments.Unnamed.Item(0);
} else {
 var WshShell = WScript.CreateObject("WScript.Shell");
 folderSpec = WshShell.CurrentDirectory; 
}

var blockSize = 1;
if (WScript.Arguments.Named.length > 0) {
 var bsValues = new ActiveXObject("Scripting.Dictionary");
      bsValues.add("K", 1024);
      bsValues.add("M", 1024*1024);
      bsValues.add("G", 1024*1024*1024);
 if(bsValues.exists(WScript.Arguments.Named.Item("bs"))) {
  blockSize = bsValues.Item(WScript.Arguments.Named.Item("bs"));
 } else {
  blockSize = 1;
 }
}

WScript.echo(new Date() + "\n");
WScript.echo(folderSpec + "\n");

var fso = new ActiveXObject("Scripting.FileSystemObject");
var folder = fso.GetFolder(folderSpec);
var folders = new Enumerator(folder.SubFolders);
var files = new Enumerator(folder.Files);
var resultOutput = "";
var total = calcSizes(folders) + calcSizes(files);
resultOutput = resultOutput.concat("\n" + "Total:\t" + Math.round(total / blockSize) );
WScript.echo(resultOutput);


function calcSizes(objs) {
 var size = 0;
 for (; !objs.atEnd(); objs.moveNext()) {
 try {
  WScript.echo( (new String(Math.round(objs.item().Size / blockSize))).rpad(8," ") + "\t" + objs.item().Name + ((objs.item().Type == "File Folder") ? "\\" : "") );
  size += objs.item().Size;
 } catch(e) {
  WScript.echo(e.message + " " + objs.item().Name);
 }
     }
 return size;
}

Usage:
cscript.exe du.js [directory] [/bs:blockSize]
  • directory -- optional parameter of the directory to use. If omitted then current direcotry is used
  • blockSize -- optional parameter. Shows sizes in Kilobytes, Megabytes or Gigabytes. Accepts values K, M or G for Kilobytes, Megabytes and Gigabytes respectively. If omitted the sizes are show in bytes. This is the default.
Example

C:\scripts>cscript.exe du.js c:\
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.

Thu Sep 11 12:35:07 UTC+0500 2014

c:\

4543005           $Recycle.Bin
1041265185        app
Permission denied Documents and Settings
0                 PerfLogs
1192361151        Program Files
Permission denied ProgramData
148009089         Recovery
2266              scripts
Permission denied System Volume Information
Permission denied Users
Permission denied Windows
24                autoexec.bat
10                config.sys
1073741824        pagefile.sys

Total:  3459922554

C:\scripts>

No comments: