Hatena::ブログ(Diary)

hogehoge @teramako RSSフィード

 | 

2014-03-02

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

jak-sanjak-san 2014/03/04 00:57 簡単に済ませたいなら、wmic logicaldisk list brief というのもありますよ。

teramakoteramako 2014/03/04 07:14 ふぉおおおおお、wmic 凄い。
教えていただき、ありがとうございます!

kawaisoukawaisou 2015/03/18 13:28 テラバイドでも表示されたいのですが、どのようにしたらよいのでしょうか?

kawaisoukawaisou 2015/03/18 14:27 質問内容が曖昧でしたので、もう一度質問させていただきます。

作成されたバッチファイルは G (ギガ)までしか表示されませんが、
T (タラ)でも表示できるようにするにはどうすればよいのか、
ご教授いただけたら幸甚です。

teramakoteramako 2015/03/18 15:10 その辺一ヶ所変更すればOK、みたいに綺麗に作られていないので、週末くらいまでには修正してコメントしようと思います。

teramakoteramako 2015/03/21 23:59 https://gist.github.com/teramako/9306751

更新しました。GitHub側のコードを使用してみてください。
コマンドライン引数として、k, m, g, t を受け付けるようにしました。それぞれバイトの単位になってます。
df.cmd k → キロバイト
df.cmd m → メガバイト
df.cmd g → ギガバイト
df.cmd t → テラバイト
という感じです。

kawaisou kawaisou 2015/03/23 10:17 実行できました〜 本当にすごいです!!
おかけ様で、大分楽になりました。
ご助力に感謝します。

yamadayamada 2018/05/08 17:03 すみませんが、よろしければ教えてください。
このプログラムをメモ帳にコピペして、batファイルとして保存実行だけではできないのですが、
なにかやり方がりますでしょうか?
何卒、よろしくお願いいたします。

ryoyryoy 2018/05/22 09:55 >yamadaさん
速すぎて出力結果が見えないだけではないでしょうか。
.batで保存してデスクトップ等に置き、コマンドプロンプトでリダイレクト付で実行されては?

ファイル名.bat > log.txt
のように。

トラックバック - http://d.hatena.ne.jp/teramako/20140302/p1
リンク元
 |