min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

Windows コマンドプロンプトからディスクの容量を確認する(cmdでdf)

Windowsでディスクの容量を確認する作業が地味に面倒くさい。画面の左から「コンピュータ」を選ぶ作業が面倒。

f:id:min117:20181219054409p:plain

「選べばいいだけじゃん」と思うかもしれないが、1日に何度も繰り返すこの選ぶ作業をいかに減らせるかで作業効率が全然違ってくる。コマンド一発で表示できるようにしたい。

 

同じことを考える天才がいた。WindowsバッチでLinuxのdfコマンドを実装している。

d.hatena.ne.jp

Windows でディスク使用率等の一覧を表示する · GitHub

 

さっそく写経。

f:id:min117:20181219053733p:plainf:id:min117:20181219053824p:plain

 

実行してみる。まずはコマンドプロンプト(cmd)を起動する。

f:id:min117:20181219053902p:plain

Windowsキー + R → cmd と打てばマウスを一切触らずに起動できる。

 

実行。

f:id:min117:20181219054017p:plain

素晴らしい。最高すぎる。

 

 

 

Total(ディスク全体の大きさ)」「Used(使用領域)」「Free(空き領域)」だけ取り出したい。まずはfor文を使ってバッチの実行結果を取り出して変数に格納してみる。

cmd> for /F "tokens=1,2,3,4,5,6 delims= " %i in ('df.bat') do @echo %i %j %k %l %m %n | find ":"

f:id:min117:20181219055556p:plain

Total、Used、Freeの列だけにする。

for /F "tokens=1,2,3,4,5,6 delims= " %i in ('df.bat') do @echo %i %k %l %m | find ":"

f:id:min117:20181219060148p:plain

素晴らしすぎる。いくらでも応用できそう。

min117.hatenablog.com

min117.hatenablog.com

 

gist.github.com

 

 

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

var COLUMN_INFOs = {
k: {
drive: { width: 5, align: "left" },
type: { width: 4, align: "left" },
total: { width: 14, align: "right" },
used: { width: 14, align: "right" },
free: { width: 14, align: "right" },
pct: { width: 4, align: "right" },
byteUnit: "K"
},
m: {
drive: { width: 5, align: "left" },
type: { width: 4, align: "left" },
total: { width: 14, align: "right" },
used: { width: 14, align: "right" },
free: { width: 14, align: "right" },
pct: { width: 4, align: "right" },
byteUnit: "M"
},
g: {
drive: { width: 5, align: "left" },
type: { width: 4, align: "left" },
total: { width: 9, align: "right" },
used: { width: 9, align: "right" },
free: { width: 9, align: "right" },
pct: { width: 4, align: "right" },
byteUnit: "G"
},
t: {
drive: { width: 5, align: "left" },
type: { width: 4, align: "left" },
total: { width: 9, align: "right" },
used: { width: 9, align: "right" },
free: { width: 9, align: "right" },
pct: { width: 4, align: "right" },
byteUnit: "T"
}
};

function main(args) {
var unit = args(0) || "g";
var columnInfo = COLUMN_INFOs[unit.toLowerCase()];
if (!columnInfo) {
WScript.Echo("argument must be 'k', 'm', 'g', 't' or empty.");
WScript.Quit(1);
}
showDrives(columnInfo);
}
main(WScript.Arguments);

function showHeader(aCI) {
//WScript.Echo("Drive Type Total Used Free % ValumeName");
//WScript.Echo("----- ---- ------- ------- ------- ---- ----------");
var unit = "(" + aCI.byteUnit + "B)";
WScript.Echo([
align("Drive", aCI.drive.width, aCI.drive.align),
align("Type", aCI.type.width, aCI.type.align),
align("Total" + unit, aCI.total.width, aCI.total.align),
align("Used" + unit, aCI.used.width, aCI.used.align),
align("Free" + unit, aCI.free.width, aCI.free.align),
align("%", aCI.pct.width, aCI.pct.align),
"ValumeName"
].join(" "));
WScript.Echo([
StringRepeat("-", aCI.drive.width),
StringRepeat("-", aCI.type.width),
StringRepeat("-", aCI.total.width),
StringRepeat("-", aCI.used.width),
StringRepeat("-", aCI.free.width),
StringRepeat("-", aCI.pct.width),
StringRepeat("-", 10)
].join(" "));
}

function showDrives(aColumnInfo) {
var FSO = new ActiveXObject("Scripting.FileSystemObject");
var e = new Enumerator(FSO.Drives);
showHeader(aColumnInfo);
for (; !e.atEnd(); e.moveNext()) {
showDriveInfo(e.item(), aColumnInfo);
}
}

// Drive Type Size Used Aviable Percent
// ----- ----
function showDriveInfo (aDrive, aCI) {
var msg;
if (aDrive.IsReady) {
var usedSize = aDrive.TotalSize - aDrive.FreeSpace;
msg = [
align(aDrive.DriveLetter + ":", aCI.drive.width, aCI.drive.align),
align(getDriveType(aDrive), aCI.type.width, aCI.type.align),
align(toByte(aDrive.TotalSize, aCI.byteUnit, 2), aCI.total.width, aCI.total.align),
align(toByte(usedSize, aCI.byteUnit, 2), aCI.used.width, aCI.used.align),
align(toByte(aDrive.FreeSpace, aCI.byteUnit, 2), aCI.free.width, aCI.free.align),
align((usedSize / aDrive.TotalSize * 100).toFixed(0)+"%", aCI.pct.width, aCI.pct.align),
aDrive.VolumeName
].join(" ");
} else {
msg = [
align(aDrive.DriveLetter + ":", aCI.drive.width, aCI.drive.align),
align(getDriveType(aDrive), aCI.type.width, aCI.type.align),
align("-", aCI.total.width, aCI.total.align),
align("-", aCI.used.width, aCI.used.align),
align("-", aCI.free.width, aCI.free.align),
align("-", aCI.pct.width, aCI.pct.align)
].join(" ");
}
WScript.Echo(msg);
}

function toByte (aNum, aByteType, aFixSize, aShowUnit) {
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;
case "T":
byteSize = 1024 * 1024 * 1024 * 1024;
break;
default:
throw new TypeError("Unknown ByteType: " + aByteType);
}
return (aNum / byteSize).toFixed(aFixSize) + (aShowUnit ? postfix :"");
}

function align (aStr, aSize, aType) {
var spaces = StringRepeat(" ", aSize);
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 AlignmentType");
}
}

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 "???";
}
}

function StringRepeat (aStr, aCount) {
var result = "";
for(;;) {
if (aCount & 1) {
result += aStr;
}
aCount >>= 1;
if (aCount) {
aStr += aStr;
} else {
break;
}
}
return result;
}