web-dev-qa-db-ja.com

Cドライブに2 GBの空きディスク容量があるかどうかを確認します

ターゲットPCに少なくとも2 GBの空き容量があるかどうかを確認しようとしています。ここに私がこれまでに持っているものがあります:

@echo off
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set "FreeSpace=%%x"
IF /i %FreeSpace% GTR "2147483648" (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)

2 GBに設定しても200 GBに変更しても、このドライブには90 GBしかありませんが、十分な空き容量があると常に表示されます...可能な場合は、助けてください。

この質問は、上のコードを基にしたものでした: バッチコマンドを使用して空きディスク領域を確認してください

動作するように見えますが、動作しません。

7
Sean Beegle

コードに2つの問題があります。

1)IFは、両側の文字列が数値に評価される場合にのみ数値比較を行います。左側は数値ですが、右側には引用符があります。これにより、比較全体が文字列セマンティクスを使用して実行されます。数字は常に引用符よりも上位にソートされるため、常にTRUEを報告します。

オースティンが彼の答えで示唆しているように、引用符を削除すると、あなたのケースでは正しく答えが得られます。 しかしそれだけではありません!実際には、空き容量がまたは2147483647です。

2)Windowsバッチ(cmd.exe)の数値は、符号付き32ビット精度に制限されています。これは、最大値2 GB -1バイト(2147483647)に相当します。IFステートメントに2147483647より大きい数値は2147483647として扱われるという奇妙な(恐らくは不幸な)動作があります。そのため、この手法を使用して2147483647より大きい値の空き領域をテストすることはできません。

詳細は https://stackoverflow.com/q/9116365/101205 を参照してください。

リンクの答えには、多数のテストに使用できる手法が記載されています。条件の両側を同じ幅になるように左パディングし、文字列比較を強制する必要があります。

たとえば、以下は、空き容量が4294967296(4 GB)以上であるかどうかをテストします

@echo off
setlocal
set "pad=000000000000000"
set "NeededSpace=%pad%4294967296"
for /f "delims== tokens=2" %%x in (
  'wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value'
) do for %%y in (%%x) do set "FreeSpace=%pad%%%y"
if "%FreeSpace:~-15%" geq "%NeededSpace:~-15%" echo Drive has at least 4 GB free space.
11
dbenham

数字から"sを取り出すと、スクリプトはほぼ正しく機能します。 "sを使用すると、数値比較ではなく文字列比較が強制されます。

Dbenhamが指摘しているように、CMDは数値を32ビットの符号付き整数としてのみ格納(および比較)します。 GBをチェックしているので、重要度の低い数字のいくつかは合理的に無視できます。最後の6桁を削除しても、最大2エクサバイトの空き領域を正しく検出しながら、MBの解像度が維持されます。また、前述のように、末尾に余分な文字があるため、WMICの結果から「削除された桁数」+1を削除する必要があります。

@ECHO off
SETLOCAL EnableDelayedExpansion
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) DO SET "FreeSpaceBig=%%x"
SET FreeSpace=!FreeSpaceBig:~0,-7!
IF %FreeSpace% GTR 2147 (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)
ENDLOCAL

注:ここでも/iは必要ありません。これは、文字列の比較のためだけであり、整数の比較を行っているためです。また、この操作でWMIを呼び出さないようにする場合は、dir c:\ /-C | find "bytes free"の代わりにwmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:valueを使用できます(これにより、EnableDelayedExpansionを省略し、代わりに%を使用できます!FreeSpaceBig 4行目。とにかく、それはスクリプトであり、通常、ジョブを完了するには多くの方法があります。

関連:

https://stackoverflow.com/questions/293780/free-space-in-a-cmd-Shellhttps://stackoverflow.com/questions/9099138/save-values- batch-file/9099542#9099542https://stackoverflow.com/questions/7769918/comparing-2-numbers-in-dos-batch-not-working

3
austinian

ドライブに十分な空き容量があるかどうかを確認するだけの場合(たとえば、何かをインストールまたはコピーするため)、次のようなwmicクエリを試すことができます。

wmic LogicalDisk where "DeviceID='c:' and FreeSpace > 10737418240" get DeviceID 2>&1 ^ | find /i "c:" >nul || (echo not enough space&exit 1)

これにより、Cの空き容量が10 GB未満の場合、バッチファイルの実行が中断されます。

0
anilech