1

Тема: CMD/BAT: Сравнение свободного места на диске

Добрый день.
Есть такой скрипт который определяет свободное место на диске.
Мне необходимо его сравнить с переменной, но значение получаемое в цикле имеет в начале пробел и поэтому сравнение не работает. Помогите решить данную проблему или модернизировать скрипт.


echo off
set DISK=C:
set SPACE=15000000
for /f "skip=2 tokens=2 delims=:" %%i in ('fsutil volume diskfree %DISK%') do set /a FREESIZE=%%i
if "%FREESIZE%" lss "%SPACE%" ((echo Мало свободного места на диске.)
) else (echo На диске %DISK% достаточно свободного места.)
 

2

Re: CMD/BAT: Сравнение свободного места на диске

Неправильно расставлены скобки
Надо


for /f "skip=2 tokens=2 delims=:" %%i in ('fsutil volume diskfree %DISK%') do (
    set /a FREESIZE=%%i
    if "%FREESIZE%" lss "%SPACE%" (
        echo Мало свободного места на диске.
    ) else (
        echo На диске %DISK% достаточно свободного места.
    )
)
( 2 * b ) || ! ( 2 * b )

3 (изменено: pacman_sa, 2013-01-15 11:23:04)

Re: CMD/BAT: Сравнение свободного места на диске

%FREESIZE% возвращает значение "" из за того  что fsutil volume diskfree %DISK% возвращает значение " 123123123123" т.е. в начале пробел.

И как избежать данное ограничение: Invalid number.  Numbers are limited to 32-bits of precision.

4

Re: CMD/BAT: Сравнение свободного места на диске

Сравнивайте как строки, дополненные слева нулями и выровненные по правому краю.


set A=123
set A=000000%A%
set A=%A:-6%

Или воспользуйтесь другим интерпретатором, например JScript.

( 2 * b ) || ! ( 2 * b )

5

Re: CMD/BAT: Сравнение свободного места на диске

JScript я хуже знаю и он для задачи немного не подходит.
3-я строка не отрабатывает


c:\tools\scripts\test>set A=123

c:\tools\scripts\test>set A=000000123

c:\tools\scripts\test>set A=A:-6

6 (изменено: Rumata, 2013-01-15 14:54:25)

Re: CMD/BAT: Сравнение свободного места на диске

pacman_sa пишет:

3-я строка не отрабатывает

Прошу прощения. Опечатка. Должно быть:


set A=%A:~-6%

JScript я хуже знаю и он для задачи немного не подходит.

Ну почему же не подходит? Не вдаваясь в дебри совместного использования cmd/jscript (темы 1, 2), очень даже подходит:

Пример кода: showusage.js


var stdin = WScript.StdIn;

stdin.SkipLine();
stdin.SkipLine();

var free = stdin.ReadLine().replace(/^.+: /, '');

WScript.Echo(free < 15000000 ? 'Not enough diskspace' : 'OK');

Пример использования


fsutil volume diskfree с: | cscript //nologo showusage.js
( 2 * b ) || ! ( 2 * b )

7

Re: CMD/BAT: Сравнение свободного места на диске

Прошу прощения. Опечатка. Должно быть:


set A=%A:~-6%

Спасибо, я разобрался. Сравнение строковых параметров у меня не получилось (. Видно руки не из того места растут ).


echo on
set DISK=C:
set SPACE=12000
for /f "skip=2 tokens=2 delims=:" %%i in ('fsutil volume diskfree %DISK%') do (
    set FREESIZE=%%i
    set FREESIZE=%FREESIZE:~-12%
    echo %FREESIZE%
    if "%FREESIZE%" lss "%SPACE%" (
        echo Мало свободного места на диске %DISK%.
    ) else (
        echo На диске %DISK% достаточно свободного места.
    )
)

fsutil volume diskfree с: | cscript //nologo showusage.js

При любых значениях перед "free" выводит OK )), здесь не моу разобраться.

8

Re: CMD/BAT: Сравнение свободного места на диске

а на ограничение всем покласть ?

Я конечно далек от мысли... (с)

9

Re: CMD/BAT: Сравнение свободного места на диске

Внутри скобок не %FREESIZE%, а !FREESIZE!

10

Re: CMD/BAT: Сравнение свободного места на диске

Arigato пишет:

Внутри скобок не %FREESIZE%, а !FREESIZE!

В каком месте?

11

Re: CMD/BAT: Сравнение свободного места на диске

@echo off &setlocal enableextensions &chcp 1251 >nul

set DISK=D:
set SPACE=15
for /f "skip=2 tokens=2 delims=:" %%i in ('fsutil volume diskfree %DISK%') do set FREESIZE=%%i
set FREESIZE=%FREESIZE:~0,-7%
if %FREESIZE% lss %SPACE% (
    echo Мало свободного места на диске.
) else (
    echo На диске %DISK% достаточно свободного места.
)

из-за "особенности" вывода приходится откусывать на 1 символ больше: 7 для MB – по крайней мере на XP

12

Re: CMD/BAT: Сравнение свободного места на диске

!k пишет:
@echo off &setlocal enableextensions &chcp 1251 >nul

set DISK=D:
set SPACE=15
for /f "skip=2 tokens=2 delims=:" %%i in ('fsutil volume diskfree %DISK%') do set FREESIZE=%%i
set FREESIZE=%FREESIZE:~0,-7%
if %FREESIZE% lss %SPACE% (
    echo Мало свободного места на диске.
) else (
    echo На диске %DISK% достаточно свободного места.
)

из-за "особенности" вывода приходится откусывать на 1 символ больше: 7 для MB – по крайней мере на XP

Всем огромное спасибо, особенно !k. Все работает.

Я думаю можно закрыть тему.

13

Re: CMD/BAT: Сравнение свободного места на диске

cmd /q /v:on /c "for /f "tokens=3"  %x in ('dir /-c x:\.. ^| sort') do (echo %x&exit /b)"

и по сабжу ненадо ничего "откусывать"

Я конечно далек от мысли... (с)

14 (изменено: smaharbA, 2013-01-18 20:57:21)

Re: CMD/BAT: Сравнение свободного места на диске

и еще справку не помешало бы почитать


cmd /q /v:on /c "(if "1999999999999" lss "9" echo 1999999999999 ^< 9) & (if 1999999999999 gtr 9 echo 1999999999999 ^> 9)"

хотя да, тут не совсем прав

к слову

set FREESIZE=%FREESIZE: =%

Я конечно далек от мысли... (с)

15

Re: CMD/BAT: Сравнение свободного места на диске

вариант с вми

for /f %%x in ('wmic logicaldisk where name^='c:' get freespace /format:value') do set %%~x>nul
echo "%FreeSpace%"

Я конечно далек от мысли... (с)

16 (изменено: !k, 2013-01-19 02:02:34)

Re: CMD/BAT: Сравнение свободного места на диске

smaharbA пишет:

cmd /q /v:on /c "for /f "tokens=3"  %x in ('dir /-c x:\.. ^| sort') do (echo %x&exit /b)"

далеко не всегда даёт верный результат

а откусывать нужно чтобы сравнивать числа и не упереться в ограничение 2^31

если же сравнивать строки, то придётся возится с выравниванием длины строк

17

Re: CMD/BAT: Сравнение свободного места на диске

сколько нужно "откусить" у числа 456 и 456000000000 ?

Я конечно далек от мысли... (с)

18

Re: CMD/BAT: Сравнение свободного места на диске

pacman сравнивает с МБ, поэтому в любом случае нужно откусить 6 цифр

@echo off &setlocal enableextensions &chcp 1251 >nul

set DISK=D:
set SPACE=15
for /f "skip=2 tokens=2 delims=:" %%i in ('fsutil volume diskfree %DISK%') do set FREESIZE=%%i
set FREESIZE=%FREESIZE:~0,-7%
if "%FREESIZE%" == "" set /a FREESIZE=0
if "%FREESIZE%" == " " set /a FREESIZE=0
if %FREESIZE% lss %SPACE% (
    echo Мало свободного места на диске.
) else (
    echo На диске %DISK% достаточно свободного места.
)

19

Re: CMD/BAT: Сравнение свободного места на диске

а сколько цифир нухно откусить у числа 456 ?

Я конечно далек от мысли... (с)