2016-10-27 16 views
0


バッチに問題があります。 ディレクトリのサイズをバッチテストし、大きすぎる場合は最も古いファイルを削除します。windowsバッチ変数のサイズ最大

バッチ:

@echo off 
setlocal enabledelayedexpansion 
net use T: /d 
net use T: \\10.230.78.22\survcam 

set dossiure=T:\ 
set "$max=204010946560" 

Echo traitement en cours.... 

:loop 
for /f "tokens=3 delims= " %%a in ('dir %dossiure% ^| find /i "octets"') do (
    set $NbBytes=%%a 
    goto:test 
) 
:test 

If %$NbBytes% GTR %$max% (
    for /f "delims=" %%a in ('dir %dossiure% /b/a-d/od') do (
     set LeVieux="%dossiure%%%a" 
     Echo Destruction de : [!LeVieux!] 
     del "!LeVieux!" 
     goto:wait 
    ) 
) 
goto:fin 
:wait 
rem ping localhost -n 1 
goto:loop 
:fin 
net use T: /d 
echo fini 

場合は$最大= 85899345920
それは(80GiB)okです
が、$ maxのは= 204010946560
はそれがerease指示されたサイズよりも多くの(190GiB)
それはそれがそれを修正する方法を知っているのでしょうか?

答えて

2

バッチ内の数値変数の最大値は2^31です。

あなたの変数はあなたが数値であることを知って、両方の単一の文字列であるため、それ

set "$$max=000000000000000000000%$max%" 
set "$$NbBytes=000000000000000000%$NbBytes%" 
if %$$NbBytes:~-18% GTR %$$max:~-18% (

を試行し、MIBに計算してみたり2つの変数(MBおよびバイト)


を使用しますが、変数の先頭に0という大きな数の接頭辞をつけ、最後のn(私は18文字を選択)の文字列を比較します。

+0

2^31 = 2147483648 制限付き2GiB なぜそれが制限付きで動作するのですか?80 GiB – ChriGon

+2

使用している**文字列**が2^31を超えているため、バッチは**文字列比較**に切り替わりますモードを選択し、左から右の文字を比較します。すべてのバッチ変数は文字列です。 'set/a'は文字列を数値に変換し、計算して文字列に変換します。同様に、 '=='以外の比較演算子で 'if'を実行すると、文字列から数値への変換が行われます。どちらかの側が範囲内の数値に変換できない場合、比較は生の文字列に対して実行されます。 – Magoo

+0

あなたの答えをありがとう、今私はよく理解しています。 – ChriGon

関連する問題