【问题标题】:Batch file only showing the first color mentioned仅显示提到的第一种颜色的批处理文件
【发布时间】:2020-04-14 20:03:12
【问题描述】:

我制作了这个脚本,它应该根据 C 盘的空间大小来改变文本的颜色。但它只会更改为提到的颜色。例如,如果我把 :红色 进而 :蓝色, 它只会变成红色并忽略蓝色部分。 这是我的脚本的代码。如果可以的话,请告诉我如何解决它。

@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

【问题讨论】:

  • 如果您期望硬盘空间完全匹配非常特定的字节数,我认为您应该考虑进行抽奖。很有可能会报告大小,并且控制台颜色会在关闭前变为青色,即使您解决了主要问题也是如此。您的主要问题是未引用的变量值永远不会匹配引用的一系列数字。 (If "%var%" == "string")
  • 哦,好的,谢谢你告诉我。

标签: batch-file colors goto


【解决方案1】:

颜色(理解控制流)

正如 Compo 所提到的,您针对常量的所有大小测试都不匹配,因此控制流不会分支到您定义的任何“颜色跳转点”。控制流只是继续执行您给定示例中以下:Cyan 部分中的下一个语句。然后应用该颜色并在青色部分的exit 语句处停止执行。
通常你会在许多比较的行之后放置一个“默认分支”,以避免控制流传递到脚本中不需要的部分。

示例代码段:

[...]
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 位),短于 40 亿(正好是 4,294,967,296)。
如果字节数超过这 40 亿个限制(仅约 4 GB),那么您尝试将 Gigabyte 驱动器大小与 Terabyte 比例(以表示单个字节的数字进行比较)总是会导致错误消息 - 真是太糟糕了! :(
检查批处理文件中的大型驱动器大小的唯一方法是获取兆字节或千兆字节的值。即使是 2TB 驱动器也将“仅”具有大约 2000 GB,这在 40 亿范围内。以兆字节为单位计算 2TB 将是 2,000,000 MB,这也将保持在限制之下,并给出更准确的数字,但不会精确到最后一个字节。

现在,要将长数字“重新计算”为更短的千兆字节值,您需要使用字符串操作。这个想法是 2TB in Bytes (=2199023255552) 可以缩短最后 9 位,结果大致以 GB 为单位,在这种情况下,结果将是 2199 GB。

要删除最后一位数字,请参考以下原则:%variablename:~X,Y%,它记录在 set 的帮助中(在 cmd.exe 窗口中键入 set /? 以查看文档)。
提到的语法允许从起始位置 X 切割字符串,长度为 Y 个字符(或数字)。方便的是,您还可以指定负长度,这意味着“到最后一个但 Y 个字符”。因此,您将使用 set size_gb=%size:~0,-9% 之类的东西来减少您的大小字符串(第一个数字的索引位置为 0)。
如果您的数字小于 1 GB,则结果将是一个空字符串 (""),因为您实际上删除了每个数字。

有了这些知识,你可以建立这样的东西

if not "%size:~0,-9%" == "" (
  set size_gb=%size:~0,-9%
  echo Size in GB is: %size_gb%
)

我希望你可以让你的脚本自己从那里开始工作。祝您好运,并在您的项目中学习和体验新事物时获得乐趣:)

顺便说一句:还可以在命令行上查看if /? 以阅读有关比较的文档。您可能希望将大小与“大于”逻辑(GTR,>=)进行比较,而不仅仅是“等于”(EQU,==)。

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多