私はコマンドラインプログラミングの初心者で、作成したいスクリプトがあります。私がしなければならないことの1つは、フォルダーの内容のサイズを決定し、後で比較するために変数とともに数値を保存することです。
Windows 7のコマンドラインを実行していますが、一部のファイルが2GBを超える場合があります。
提供された支援に感謝します。
私はコマンドラインプログラミングの初心者で、作成したいスクリプトがあります。私がしなければならないことの1つは、フォルダーの内容のサイズを決定し、後で比較するために変数とともに数値を保存することです。
Windows 7のコマンドラインを実行していますが、一部のファイルが2GBを超える場合があります。
提供された支援に感謝します。
この単純な問題を純粋なネイティブ バッチで解決するのがいかに難しいかは驚くべきことです。
編集 - この回答は、すべてのサブフォルダーの累積ファイル サイズを含めるように編集されています。
DIR /S コマンドは、フォルダーとそのサブフォルダー内のすべてのファイルの合計サイズを示しますが、出力はコンピューターのロケール設定 (言語) によって異なります。FIND コマンドはフォルダー サイズを含む行を分離でき、FOR /F を使用して結果を解析します。フォルダごとに 1 つの「File(s)」行と、総計を含む最終エントリがあります。最後の SET コマンドは、以前の値に取って代わります。最後に、変数展開の検索と置換を使用して、3 桁ごとの区切り文字を削除します。
これにより、米国のマシン上の特定のフォルダー内の合計バイト数が取得されます。フォルダーのパスは、最初の引数で指定する必要があります。使用する "。" 現在のディレクトリ用。
@echo off
setlocal
for /f "tokens=3" %%A in ('dir "%~1\"^|find "File(s)"') do set size=%%A
set "size=%size:,=%"
echo Folder "%~f1" contains %size% bytes
上記は、ロケールごとに変更する必要があります。たとえば、「ファイル」は言語によって異なり、一部の国では「.」が使用されます。"," の代わりに千単位の区切り記号として使用します。
ただし、後でサイズを他の値と比較する場合、IF ステートメントは 2147483647 (~2 ギガバイト) の数値しか比較できないため、これでは半分しか到達しません。2147483647 を超える数値はすべて 2147483647 として扱われます。この問題を回避する方法は、遭遇する任意の数値よりも大きくなることが「保証」される一定の幅になるまで数値をゼロで左パディングすることです。次に、比較に数値以外の文字を含めて、IF に文字列比較を強制します。私は、数値幅が 15 桁 (~999 テラバイト) の引用符を使用するのが好きです。
@echo off
setlocal
for /f "tokens=3" %%A in ('dir "%~1\"^|find "File(s)"') do set size=%%A
set "size=%size:,=%"
echo Folder "%~f1" contains %size% bytes
:: Left pad the width to 15 digits
set "paddedSize=000000000000000%size%"
set "paddedSize=%paddedSize:~-15%"
:: Compare the size to 1 Terabyte
if "%paddedSize%" gtr "001099511627776" echo The folder is larger than 1 Terabyte
注: DIR コマンドは、合計ファイル サイズを計算するときに、代替データ ストリームを無視します。代替データ ストリームは、NTFS ボリューム上のファイルに関連付けることができる非表示のコンテンツです。詳細については、 http://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/を参照してください。
もう 1 つの方法は、compact /s
.compact ツールを使用することです。変換されず、すべての Windows マシンで同じように動作するはずです。
@echo off
pushd "%~1"
for /f %%s in ('compact /s ^| find " total bytes"') do (
set _size=%%s
)
echo folder size is : %_size:,=% bytes
popd