質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Q&A

解決済

1回答

1496閲覧

Windowsのバッチファイルについて、bytes単位以外(例えばkbytesやGbytesなど)でフォルダやドライブの容量を取得したい

doratora

総合スコア10

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

0グッド

0クリップ

投稿2023/10/03 08:47

実現したいこと

Windowsのバッチファイルでbytes単位以外(例えばkbytesやGbytesなど)で特定のフォルダやドライブの容量を取得したい

前提

WindowsPCにて特定のフォルダで使用している容量がドライブ全体のどれだけ占めているかを確認するバッチファイルを作成しています。

使用しているコマンドは、以下のとおりです。
特定のフォルダの容量を取得する:dir /S <Path>
ドライブ全体の容量を取得する:wmic logicaldisk get name,size

発生している問題・エラーメッセージ

上記で使用しているコマンドでサイズを取得すると、ともにバイト単位でしか取得できません。
そのため、取得できるサイズの値が32bitの範囲を超え、演算をすることができません。

試したこと

上記のコマンドについて調べてみましたが、バイト単位以外(例えばキロバイトなど)で表示させるオプションなどが見当たらない次第です。

補足情報(FW/ツールのバージョンなど)

OS:Windows10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

cmd.exeの機能だけでは、符号付き32bitを越える算術計算は出来ないので、最初から別のツール(PowerShell、VBScript等)を使うというのが普通だと思います。

ただ、ディスク上で使っている領域の大きさを知りたいなら、そもそもバイト単位のサイズを合計しては駄目です。
ディスク上の領域割り当ては4KB単位(フォーマットの仕方によって違うかも。ファイルのプロパティーの「ディスク上のサイズ」の単位)なので、バイト単位のファイルサイズを4096単位に切り上げて合計すれば、全体がテラバイト単位のサイズまで計算できるはずです。
set /a BLOCKCOUNT=(SIZE+4095)/4096
これの合計に4096を掛けた物がディスク上のサイズのバイト数です。バッチ中で掛けるとオーバーしますが。

細かいことを言うと、NTFSの場合、小さいファイルはNTFSのMFTの空きエリアに格納されて領域を消費しない(小さいファイルは、「ディスク上のサイズ」がゼロ)ので、そこまで考慮するなら、サイズが一定以下ならゼロと見なすようにする。
手元の環境だと720バイトまでは「ディスク上のサイズ」がゼロで、721バイトになると「ディスク上のサイズ」が4096です。この720も環境依存なのかどうか不明。

容量管理できればいいのなら、そういうツールを使うのも楽です。Diskonfo https://forest.watch.impress.co.jp/library/software/diskinfo/ とか。

投稿2023/10/03 09:38

otn

総合スコア86295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/10/03 10:03

符号付き32bitでのサイズが2GBなので、それに4Kを掛けると、8TBのディスクまでは上記の方法でOKです。 最後の 4K を掛けるところだけ、手作業でめんどうですが、合計が2TBまででいいなら、 set /a KSIZE=(SIZE+4095)/4096*4 と最初から4を掛けておけばキロバイト単位の数値になるので、最後の合計数値が分かり易い。
doratora

2023/10/03 10:50

ご回答ありがとうございます。 dirコマンドで取得した結果は、各ファイルごとのサイズを合算をしようせず、下の方に出力される合計サイズを使用しています。 各ファイルごとのサイズを合算してサイズを取得する方法を実施した場合、上記の計算方式でもファイル単体で2GBを超える物がある場合は、やはり合計は計算不可になるということでよろしいでしょうか? 又、ドライブのサイズをバイト以外で取得する方法はないということでよろしいでしょうか? 上記のことから、バッチで実現することは不可能という認識でよろしいでしょうか?
otn

2023/10/03 11:52

まずは、ディスクの領域使用量を知りたいのか、ファイルサイズの単純合計を知りたいのか明確にしましょう。 末尾に表示されるのは、ファイルサイズの単純合計で、ディスクの領域使用量とは異なりますが、それでいいなら最下部の値を使えば良いかと思います。 > 上記の計算方式でもファイル単体で2GBを超える物がある場合は、 これは確かにそうですね。うっかりしてました。回答に書いたのは1ファイル2GB以下前提です。 > 上記のことから、バッチで実現することは不可能という認識でよろしいでしょうか? 算数的に桁を区切って計算すれば可能と言えば可能です。面倒くさいだけ。 10進9桁までは計算可能なので、9桁単位で筆算の繰り上がり処理みたいなことをすれば良いです。 あるいは概算で良いなら、下3桁を無視すれば1000単位で、下4桁を無視すれば1000単位で計算できるので、最大2TB、20TBまで計算できます。無視じゃなくて四捨五入でもありか。 ということで、まとめると、 案1:数字の下3桁を捨てて、1000単位で計算する 案2:9桁単位に区切って筆算的な足し算をする のどちらかであれば、バッチで出来ます。案1だと2TBまでで概算(4桁捨てれば20TBまで)。案2だと無制限でバイト単位計算だけど、面倒くさい。 念のために足し算方法を書いておきます。 set SUMHIGH=合計の10桁目以上が入っている set SUMLOW=合計の1-9桁目が入っている set SIZEHIGH=ファイルサイズの10桁目以上 set SIZELOW=ファイルサイズのの1-9桁目 set /a SUMHIGH+=SIZEHIGH, SUMLOW+=SIZELOW if %SUMLOW% GTR 999999999 set /a SUMHIGH+=1, SUMLOW-=1000000000
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問