web-dev-qa-db-ja.com

.batファイルで、使用可能なディスク領域をテストするにはどうすればよいですか?

専用のバックアップサーバーの電源投入時に開始し、Robocopyを使用して本番環境を保存し、完了したらサーバーをシャットダウンする.batスクリプトがあります。

保存する前にいくつかのチェックを実行し、電源がオフになっているためにターゲットJBODケースが検出されなかった場合など、何か問題がある場合は適切な対策を要求します。

ただし、もう1つ注意点がありますが、これまでは対応できませんでした。

ターゲットディスクにすべてのファイルを受け取るのに十分なスペースがあるかどうかに関係なく、.batファイルでテストするにはどうすればよいですか? (定期的に変更される固定スペースサイズをテストすることは問題ありません。現在は100 GBに近いです。)

可能ですか?その場合、どのコマンドを調査する必要がありますか?

7
Herb

そのためにPowerShellスクリプトを使用することをお勧めします。

wmicはサイズをバイト単位で返します。バッチは、100 GBをはるかに下回る符号付き32ビット整数の数値比較に制限されています。最初に数値を切り捨てる必要があります。

パワーシェル

if ((Get-WMIObject Win32_Logicaldisk -filter "deviceid='C:'").FreeSpace -gt 100GB){
  "yes enough free space"
} else {
  "not enough free space"
}

バッチでの数値比較に関する上記の情報を拡張する必要があります
数値が同じ長さの文字列に含まれている場合、それらは文字列として有効に比較できます。
文字列比較は文字ごとに行われ、先頭のスペース/ゼロは1未満です。

現在のところ、最大ハードドライブサイズは10 TB = 10995116277760バイトで、小数点以下14桁です。次のバッチでは、すべての数値に15桁を使用しています。

@Echo off
Rem        543210987654321
Set "Blank=               "
Set "GB100=   107374182400"
Set "TB_10= 10995116277760"

for /f "tokens=2" %%A in (
  'wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "C:"'
) Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"

Echo FreeSpace="%FreeSpace%"
Echo    100 GB="%GB100%"

If "%FreeSpace%" gtr "%GB100%" (
  Echo yes enough free space
) else (
  Echo not enough free space
)

出力例:

> Check-FreeSpace.cmd
FreeSpace="   101606346752"
   100 GB="   107374182400"
not enough free space

> Check-FreeSpace.cmd
FreeSpace="  1181504520192"
   100 GB="   107374182400"
yes enough free space
12
LotPings

最も簡単な方法は、dir出力の最後の行を確認することです

dir /-c /w C: | find "bytes free"

3を取得することで、サイズ値を直接取得することもできますrd 出力のトークン

FOR /F "tokens=3 USEBACKQ" %%F IN (`dir /-c /w C:`) DO set "size=%%F"
echo %size%

ただし、文字列は別の言語では異なる可能性があるため、信頼性は高くありません。また、多くの空き容量があるが、ボリューム/ディレクトリ内の最大ファイルサイズや最大ファイル数などの制限に達しているため、これ以上ファイルを書き込めないこともあります...

最も正しい方法は

wmic LogicalDisk where DeviceID='C:' Get FreeSpace /value
9
phuclv