Цвет (Общие сведения о потоке управления)
Как уже упоминалось в Compo, все ваши тесты размеров по константам не совпадают, и, следовательно, поток управления не переходит ни к одной из определенных вами "цветовых точек перехода". Поток управления просто продолжает выполнять следующие операторы, которые находятся в следующем разделе :Cyan
в данном примере. Затем этот цвет применяется, и выполнение останавливается на операторе exit
в секции Cyan.
Обычно вы ставите «ветку по умолчанию» после строк многих сравнений, чтобы избежать прохождения потока управления в нежелательные части вашего сценария. .
Пример фрагмента:
[...]
if "%size%" == "536870912000" goto Yellow
if "%size%" == "268435456000" goto Orange
if "%size%" == "107374182400" goto Red
goto nomatch
:nomatch
echo Your drive size '%size%' did not match any of the known constants.
pause
exit
:Cyan
[...]
В разделе «nomatch» вы часто печатаете справку об использовании вашего скрипта или информацию об авторских правах и версии, как вам нравится.
Размеры накопителя (вычисления с большими числами)
Ваш проект нелегко реализовать с помощью пакетного сценария.
К сожалению, пакетные сценарии ограничены целочисленной арифметикой. Это означает, что наибольшее число, которое вы можете обработать в целочисленных сравнениях, составляет 2 ^ 32 (одно целое число имеет 32-разрядный код), что меньше 4 миллиардов (ровно 4 294 967 296).
Ваша попытка сравнить размеры дисков в гигабайтах и терабайтах Представление отдельных байтов всегда приведет к сообщению об ошибке, если число байтов превысит этот 4-миллиардный лимит, который составляет всего около 4 ГБ - какой облом! :(
Единственный способ проверить диски большого размера в пакетном файле - это получить значения в мегабайтах или гигабайтах. Даже диск объемом 2 ТБ «просто» будет иметь около 2000 ГБ, что находится в пределах 4 миллиардов. Объем 2 ТБ в мегабайтах будет равен 2 000 000 МБ, что также будет ограничено и даст немного более точные цифры, но не до последнего байта.
Теперь, чтобы «пересчитать» длинные числа в более короткий гигабайт значения вам нужно прибегнуть к строковым манипуляциям. Идея состоит в том, что 2 ТБ в байтах (= 2199023255552) можно сократить до последних 9 цифр, и результат будет примерно в ГБ, в этом случае результат будет 2199 ГБ.
Чтобы сократить числа, используйте последние цифры к этому принципу: %variablename:~X,Y%
, который задокументирован в справке для set
(введите set /?
в окне cmd.exe для просмотра документации).
Упомянутый синтаксис позволяет вырезать строки из начальной позиции X с длина символов Y (или цифры в этом отношении). Удобно, что вы также можете указать отрицательную длину, что означает «до последнего, кроме Y символов». Поэтому вы должны использовать что-то вроде set size_gb=%size:~0,-9%
, чтобы вырезать строку размера (первая ди git имеет индексную позицию 0).
Если у вас число меньше 1 гигабайта, результатом будет пустая строка (""
), так как вы по существу вырезали каждый ди git.
С этим знанием вы можете создать что-то вроде этого
if not "%size:~0,-9%" == "" (
set size_gb=%size:~0,-9%
echo Size in GB is: %size_gb%
)
Я надеюсь, что вы можете заставить свой скрипт работать там самостоятельно. sh Удачи вам и удачи в изучении и изучении новых вещей с вашим проектом:)
Кстати: также проверьте if /?
в командной строке, чтобы прочитать документацию о сравнениях. Возможно, вы захотите сравнить размеры с «больше, чем» logi c (GTR,> =) вместо просто «равно» (EQU, ==).