首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理着色器将在经过一定数量的"if's“后自动关闭。

批处理着色器将在经过一定数量的"if's“后自动关闭。
EN

Stack Overflow用户
提问于 2016-11-22 00:59:04
回答 3查看 66关注 0票数 0

我已经为我的"desktop++“程序批量制作了这个小脚本,并且我制作了一个页面,我可以在其中调整它的颜色,直到编号14:当它变成浅紫色,直到编号16,它变成明亮的白色,脚本的其余部分就不重要了,所以我想问一下是否有批处理的if语句的”最大“数量,我将在这里向您展示脚本

代码语言:javascript
复制
 :background
    cls
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    echo and what will your personal preferenced background color be today??
    echo 1 for black
    echo 2 for blue
    echo 3 for green
    echo 4 for aqua
    echo 5 for red
    echo 6 for purple
    echo 7 for yellow
    echo 8 for white
    echo 9 for gray
    echo 10 for light blue
    echo 11 for light green
    echo 12 for light aqua
    echo 13 for light red
    echo 14 for light purple
    echo 15 for light yellow
    echo 16 for bright white
    echo type back to go back
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    set /p bckgrnd=Color:
    if %bckgrnd%==1 (
    set backc=0
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==2 (
    set backc=1
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==3 (
    set backc=2
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==4 (
    set backc=3
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==5 (
    set backc=4
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==6 (
    set backc=5
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==7 (
    set backc=6
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==8 (
    set backc=7
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==back (
    goto :extracolor
    )
    if %bckgrnd%==9 (
    set backc=8
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==10 (
    set backc=9
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==11 (
    set backc=a
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==12 (
    set backc=b
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==13 (
    set backc=c
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%=14 (
    set backc=d
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==15 (
    set backc=e
    color %backc%%currentcolor%
    goto :background
    )
    if %bckgrnd%==16 (
    set backc=f
    color %backc%%currentcolor%
    goto :background
    )
    goto :background

此外,我是编程新手,主要是批处理编程,所以如果你对我的脚本有任何反馈,我将非常感激,因为我不打算发布这篇文章(个人使用),因为它实际上是为了学习批处理没有更多:我希望你们能帮助我,因为我已经使用这个网站解决我的问题很多次了,我想用它来问我自己的问题,因为我没有找到任何关于这个主题的东西。

EN

回答 3

Stack Overflow用户

发布于 2016-11-22 03:43:54

错误是14的IF-语句:

代码语言:javascript
复制
if %bckgrnd%=14 (

您使用的是单个等号而不是双等号,因此它应该是

代码语言:javascript
复制
if %bckgrnd%==14 (

但是即使你纠正了这一点,你也会发现你的程序不会像你想要的那样工作。也许你注意到了,每次你输入一个值,它只会在你下一次输入值时改变颜色。这是因为每个if块(从开始的(到结束的))都会被视为一个整体,就好像它是一个单独的命令(就像你会把它写在一行上一样)。而且,不可能将新值赋给一个变量(使用set ),并在同一命令中使用该新值(每次都在color命令中使用它)。实际上有一种方法,但这里不需要,我将在我的答案末尾添加一个链接。我们要解决这个问题的方法是遵循我将在下一段中给你的建议。

正如您在代码中看到的那样,所有的IF块(除了“back”之外)都做同样的事情:它们设置变量backc,调用color命令,并使用goto跳转到相同的标签。在编程中,建议将尽可能少的代码放在IF块中。只将差异放在IF块中,并将ressemblances放在所有IF块之后。您可以将每个IF块替换为以下形式的IF块:

代码语言:javascript
复制
IF "%bckgrnd%" == "<number>" (
    set back=<new_value>
    goto :commonPart
)

根据情况替换<number><new_value>,在所有IF块之后,您可以添加:commonPart标签,并将公共代码放在它下面:

代码语言:javascript
复制
:commonPart
color %backc%%currentcolor%
goto :background

你可能已经注意到两件事:

  1. 关于在IF-block中读取变量的问题现在消失了,我们在IF-block之外读取了值并解决了这个问题。
  2. I用双引号(")括起了IF-中比较的每个部分。这一点非常重要,因为如果用户第一次只按Enter键而没有给出任何值,或者只是给出了空格,那么您的bckgrnd变量将为空或只包含空格,并且每个IF %bckgrnd%==<number> (都将导致IF ==<number> (或类似IF ==<number> (的内容,命令解释器将无法理解这些内容,并将返回一个错误。有了双引号,它会给IF "" == "<number>" ( (或IF " " == "<number>" ( )至少提供一些东西:双引号(但不要忘记右边的双引号,也就是数字)。正如@aschipfl提到的,每次用户只需按enter键而不给出任何值,变量bckgrnd实际上将保持其先前值不变。所以在开始的时候,这个变量可以保持为空,

这就是我目前所能给出的所有建议。对于其余部分,我注意到您使用的一些变量和标签并不在您提供的代码中:当您尝试更改颜色时使用的currentcolor和case if "%bckgrnd%"=="back" (中的标签extracolor。我假设您上面给出的代码不是到目前为止您所拥有的完整脚本,所以我无法帮助您在哪里使用这些代码。特别是在使用变量更改尚未更改的color...if时,请检查应该如何使用color-command (只需在命令提示符中输入color /? )

最后,您提供的代码的最终结果应该如下所示:

代码语言:javascript
复制
@echo off
:background
cls
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo and what will your personal preferenced background color be today??
echo 1 for black
echo 2 for blue
echo 3 for green
echo 4 for aqua
echo 5 for red
echo 6 for purple
echo 7 for yellow
echo 8 for white
echo 9 for gray
echo 10 for light blue
echo 11 for light green
echo 12 for light aqua
echo 13 for light red
echo 14 for light purple
echo 15 for light yellow
echo 16 for bright white
echo type back to go back
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set /p bckgrnd=Color:
if "%bckgrnd%" == "1" (
    set backc=0
    goto :commonPart
)
if "%bckgrnd%" == "2" (
    set backc=1
    goto :commonPart
)
if "%bckgrnd%" == "3" (
    set backc=2
    goto :commonPart
)
if "%bckgrnd%" == "4" (
    set backc=3
    goto :commonPart
)
if "%bckgrnd%" == "5" (
    set backc=4
    goto :commonPart
)
if "%bckgrnd%" == "6" (
    set backc=5
    goto :commonPart
)
if "%bckgrnd%" == "7" (
    set backc=6
    goto :commonPart
)
if "%bckgrnd%" == "8" (
    set backc=7
    goto :commonPart
)
if "%bckgrnd%" == "back" (
    goto :extracolor
)
if "%bckgrnd%" == "9" (
    set backc=8
    goto :commonPart
)
if "%bckgrnd%" == "10" (
    set backc=9
    goto :commonPart
)
if "%bckgrnd%" == "11" (
    set backc=a
    goto :commonPart
)
if "%bckgrnd%" == "12" (
    set backc=b
    goto :commonPart
)
if "%bckgrnd%" == "13" (
    set backc=c
    goto :commonPart
)
if "%bckgrnd%" == "14" (
    set backc=d
    goto :commonPart
)
if "%bckgrnd%" == "15" (
    set backc=e
    goto :commonPart
)
if "%bckgrnd%" == "16" (
    set backc=f
    goto :commonPart
)

:commonPart
color %backc%%currentcolor%
goto :background

在祝您好运之前,我想提一下,实际上您可以进一步简化您的代码,因为如果仔细观察,if子句中的所有剩余代码都具有相同的逻辑:十六进制形式的backc=backgrnd - 1 (除了"back“的情况)。如果您有相同的逻辑,您可以(实际上必须)将所有这些If子句替换为只执行该逻辑的代码。不仅是批处理,其他语言也是如此。geisterfurz007在下面提供了an answer,其中所有的if子句都被一种“特殊的高级技巧”替换,为您的情况生成该逻辑。你会发现它会大大减少你的代码。

祝你好运!

PS: IF子句问题的另一种解决方案称为延迟扩展。您可以很容易地启用它:这里有一个link,它展示了如何启用它,并重复了一点原因。谷歌它可能会给你更多的信息。

票数 4
EN

Stack Overflow用户

发布于 2016-11-22 15:13:43

要大大简化代码,您可以执行以下操作:

由于您基本上是从输入中减去1,并将值更改为它的十六进制对手,因此有一种方法可以批量地这样做,以减少您的大量if构造。

代码语言:javascript
复制
set /p backgrd= Preffered Background:
if "x%backgrd"=="xback" Goto back
set /a backgrd=backgrd-1
call cmd /c exit /b %backgrd%
set hexbackgrd=%=exitcode%
set hexbackgrd=%hexbackgrd:0=%
color %hexbackgrd%%currentcolor%

这到底是做什么的?!

使用set /p,您正在读入一个值,就像您已经做的那样。

set /a将执行一个A算术动作;在本例中是一个简单的减法。

魔术发生在下一行:call cmd /c exit /b %backgrd%这将在另一个“虚拟”cmd窗口中运行命令exit /b %backgrd%,并使用值为%backgrd%的退出代码退出它。

你可以使用set hexbackgrd=%=exitcode%得到这个值(现在是十六进制)。注意百分比符号中的=!如果省略它,就会抛出一个错误。

现在%hexbackgrd%看起来像这样的0000000C。要删除前导零,可以使用下一个命令。

它设置十六进制的值,所有的0=,最后,你可以设置你的新颜色为你的新生成的背景色的值和当前的字体颜色。

请随时提出任何问题:)

票数 0
EN

Stack Overflow用户

发布于 2016-11-23 00:50:56

大家好,现在正在看这篇文章的人,是的,我已经看到了这些评论,并使用了它们,但我想提出一些我自己的有趣的东西。这是一个脚本,它使它变得容易得多,你可以通过只有两列相同的东西来做这件事,它工作得很好,尽管我建议你使用上面的那些,我只是发现很难理解它们。所以这是为我这样的新手准备的:)

代码语言:javascript
复制
:background
cls
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo and what will your personal preferenced background color be today??
echo 1 for black
echo 2 for blue
echo 3 for green
echo 4 for aqua
echo 5 for red
echo 6 for purple
echo 7 for yellow
echo 8 for white
echo 9 for 
echo 10 for light blue
echo a for light green
echo b for light aqua
echo c for light red
echo d for light purple
echo e for light yellow
echo f for bright white
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set /p background=Color:
color %background%%foreground%
goto :background

这里也是为那些只想复制粘贴前景的人准备的:

代码语言:javascript
复制
:foreground
cls
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo and what will your personal preferenced foreground color be today??
echo 1 for black
echo 2 for blue
echo 3 for green
echo 4 for aqua
echo 5 for red
echo 6 for purple
echo 7 for yellow
echo 8 for white
echo 9 for gray
echo 10 for light blue
echo a for light green
echo b for light aqua
echo c for light red
echo d for light purple
echo e for light yellow
echo f for bright white
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set /p foreground=Color:
color %background%%foreground%
goto :foreground

我希望这篇文章能帮助到你们所有人,当然,我不会为那些令人惊叹的人所发表的评论而负责,一定要感谢他们!我想感谢你看到这篇文章,并祝你的脚本好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40725460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档