Пакетный файл показывает только первый упомянутый цвет - PullRequest
0 голосов
/ 14 апреля 2020

Я создал этот скрипт, который должен менять цвет текста в зависимости от того, сколько места занимает ваш C диск. Но он меняется только на упомянутый цвет. Например, если я поставлю : красный , а затем : синий , он будет только go красным и игнорирует синюю часть. Это код для моего скрипта. Пожалуйста, дайте мне знать, как это исправить, если вы можете.

@echo off
title Disk Space Calculator


:Welcome
echo Welcome to the Disk Space Calculator (DSC)! This program will change colour depending on disk space. For example...
echo 2TB - 1TB Cyan
echo 1TB - 750GB Blue
echo 750GB - 500GB Green
echo 500GB - 250GB  Yellow
echo 250GB - 100GB Orange
echo 100GB or less Red
echo This program is recommended for disk with 2TB or less.
echo Please not that available space will be measured in bytes.
pause
goto Calculation

:Calculation
cls
FOR /F "tokens=3 USEBACKQ" %%F IN (`dir /-c /w C:`) DO set "size=%%F"
echo Your disk has %size% bytes of space
if %size%=="2199023255552" goto Cyan
if %size%=="1099511627776" goto Blue
if %size%=="805306368000" goto Green
if %size%=="536870912000" goto Yellow
if %size%=="268435456000" goto Orange
if %size%=="107374182400" goto Red

:Cyan
color b
pause
exit

:Blue
color 1
pause
exit

:Green
color a
pause
exit

:Yellow
color e 
pause
exit

:Orange
color 6
pause 
exit

:Red
color 4
pause
exit

1 Ответ

0 голосов
/ 25 апреля 2020

Цвет (Общие сведения о потоке управления)

Как уже упоминалось в 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, ==).

...