Windowsでディスク使用率等の一覧を出力するバッチファイルを書いた

仕事でディスク使用率を教えてくれっていう感じの依頼を受けることが良くあり、その都度Windowsではマイコンピュータを開いたキャプチャ画像とかを送ってやったりしていたのだが、いい加減飽きてきた。
画像じゃなくて、テキストで欲しい。
ドライブ一覧を得るコマンド(diskpart の list volume)とか使用量を見るコマンド(fsutil volume diskfree)とか、管理者権限が必要になったり、バッチ化するにもイマイチな使い勝手だし、Unixライクな df っぽいコマンドが欲しいなと思って作った。

バッチファイルだけど、JScript である。

@if(0)==(0) ECHO OFF
CScript //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end

showDrives();

function showDrives() {
  var FSO = new ActiveXObject("Scripting.FileSystemObject");
  var e = new Enumerator(FSO.Drives);
  WScript.Echo("Drive Type   Total    Used    Free    % ValumeName");
  WScript.Echo("----- ---- ------- ------- ------- ---- ----------");
  for (; !e.atEnd(); e.moveNext()) {
    showDriveInfo(e.item());
  }
}

// Drive Type Size Used Aviable Percent
// ----- ----
function showDriveInfo (aDrive) {
  var msg;
  if (aDrive.IsReady) {
    var usedSize = aDrive.TotalSize - aDrive.FreeSpace;
    msg = [
      justify(aDrive.DriveLetter + ":", 5, "left"),
      justify(getDriveType(aDrive), 4, "left"),
      justify(toByte(aDrive.TotalSize, "G", 2), 7, "right"),
      justify(toByte(usedSize, "G", 2), 7, "right"),
      justify(toByte(aDrive.FreeSpace, "G", 2), 7, "right"),
      justify(((usedSize / aDrive.TotalSize * 100).toFixed(0) + "%"), 4, "right"),
      aDrive.VolumeName
    ].join(" ");
  } else {
    msg = [
      justify(aDrive.DriveLetter + ":", 5, "left"),
      justify(getDriveType(aDrive), 4, "left"),
      justify("-", 7, "right"),
      justify("-", 7, "right"),
      justify("-", 7, "right"),
      justify("-", 4, "right"),
    ].join(" ");
  }
  WScript.Echo(msg);
}

function toByte (aNum, aByteType, aFixSize) {
  var byteSize = 1;
  var postfix = aByteType.toUpperCase();
  switch (postfix) {
    case "K":
      byteSize = 1024;
      break;
    case "M": 
      byteSize = 1024 * 1024;
      break;
    case "G":
      byteSize = 1024 * 1024 * 1024;
      break;
    default:
      throw new TypeError("Unknown ByteType: " + aByteType);
  }
  return (aNum / byteSize).toFixed(aFixSize) + postfix;
}

function justify (aStr, aSize, aType) {
  var spaces = (new Array(aSize + 1)).join(" ");
  switch (aType) {
    case undefined:
    case 0:
    case "left":
      return (aStr + spaces).slice(0, aSize);
    case 1:
    case "right":
      return (spaces + aStr).slice(-aSize);
    default:
      throw new TypeError("Unknown JustifyType");
  }
}

function getDriveType (aDrive) {
  switch (aDrive.DriveType) {
    case 1: // Removable
      return "RDD";
    case 2: // HardDisk
      return "HDD";
    case 3: // NetworkDirve
      return "Net";
    case 4: // CD
      return "CDD";
    case 5: // RAM Disk
      return "RAM";
    case 0:
    default: // Unknown
      return "???";
  }
}

コード冒頭の謎記述は http://d.hatena.ne.jp/miya2000/20090823/p0 を参照。

出力結果

> df.bat
Drive Type   Total    Used    Free    % ValumeName
----- ---- ------- ------- ------- ---- ----------
A:    RDD        -       -       -    -
C:    HDD   60.00G  24.51G  35.48G  41%
D:    CDD        -       -       -    -
E:    CDD        -       -       -    -
Z:    Net  930.71G 658.18G 272.53G  71% Shared Folders