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