【问题标题】:Batch setting REM as variable to make code look different将 REM 批量设置为变量以使代码看起来不同
【发布时间】:2017-04-14 11:05:24
【问题描述】:

最近我开始将行注释为 double :: ,但我知道它可能会在较长的“for”或“choice”脚本中产生问题,以及“goto”的问题,正如它所描述的 What does :: (double colon) mean in DOS batch files?

所以我想知道是否可以将变量设置为 REM 并使用它?

我在某个小 cmd 脚本中看到过,并且非常喜欢它,因为它使批处理代码对我来说看起来更清晰。但我想知道它是否不会产生任何问题?

@echo off
Set #=REM
%#% show date
echo it's %date%
%#% let's wait few seconds...
ping 1.1.1.1 > nul
echo and now it's %date%
%#% whatever
exit

【问题讨论】:

    标签: windows batch-file variables cmd


    【解决方案1】:

    没问题,什么都可以。

    该变量有效地用作宏,我经常使用该技术(尽管不是为了备注)。批处理解析器在对代码逻辑进行任何解释之前扩展变量内的代码,因此它的功能与您希望/期望的完全一样。

    实际上有一种复杂的技术可以创建带有参数的批处理宏。 http://www.dostips.com/forum/viewtopic.php?f=3&t=2518 的帖子描述了最终的语法,http://www.dostips.com/forum/viewtopic.php?t=1827 展示了随着时间的推移该技术的发展。

    您将%#% 用作REM 宏是完全有效的,并且没有一种“最佳”样式。但我更喜欢将:: Comment 用于不在括号内的备注,而%= comment =% 用于在括号内的备注。最后一种语法只是一个未定义的变量,它被扩展为空。只有少数动态伪变量名称中包含=,任何批处理变量都不可能名称中包含两个=。因此,只要评论不包含:%,该技术就可以安全使用。

    【讨论】:

      【解决方案2】:

      当我在批处理中写一个 rem 注释时,我把它放了一个比当前代码缩进更多的空白。 由于我的代码缩进是 2 个空格,所以对我来说非常易读,并且立即映入眼帘。

      ...
       rem my comment
      ...
      

      Rem cmets 在使用 echo on 进行调试时很有帮助:该行被读取到行尾。使用所有%variables% 以及参数%1 ... %9 %*。 然而,这意味着 rem 注释中循环内的所有变量仅在开始时解析 - 因为命令 rem 在执行前显示一次,但在执行期间保持静默。

      如果要在括号内显示调试各种变量,则必须用 echo rem 显示。 对于这样的调试,建议设置一个变量,以便在调试关闭时 rem else 在调试 echo rem 时。

      If defined debug (set "rem=echo rem") else set "rem=rem"
      

      对于其他不应显示两次的调试,我使用变量%mon%。这是我在 echo off 到 echo 和 echo on rem 的情况下戴上的。

       rem < :checkEchoOn
      :checkEchoOn
      :: Liest ob ECHO ON oder OFF geschalten ist um Variablen zu setzen
      :: VAR Mon = read ECHO ON / OFF ;set Echo( / rem
       rem = :checkEchoOn
      @(
       rem ^%Mon% Zeilen bei Echo on auf REM umschalten
      echo>"%temp%\isOn.Ft"
       < "%temp%\isOn.Ft" find "ON" >nul
      if not errorlevel 1 set "Mon=rem"
      if     errorlevel 1 set "Mon=echo("
      del "%temp%\isOn.Ft"
       rem > END checkEchoOn
      if /i "%~0" equ ":CheckEchoOn" exit /b
      )
       %mon% this is a visible comment - only once 
      

      正如 Dave 已经写的那样,以 2 双冒号开头的 cmets 不在循环括号内开始。让人们在循环包中仍然这样做。 这些 :: cmets 通常是对正在调用的批处理或函数的解释。

      请注意,这些行已完全读入。 %Variable% 和参数 %1 ... %9 %* 以及特殊字符被视为在要执行的行上(参见 Jebs 声明)。 独自一人已经是仔细写这些评论行的原因。 这些 :: 注释行可以写成多行,这意味着在行尾的(未屏蔽的)插入符号,下一行被视为注释的延续。因此,多个连续的注释行没有双点是可能的。

      %== loop commentaries % 主要用于代码概览。

      我使用的另一种 cmets 是 if-loop 注释。这也用于调试,但只对功能进行一次镜像。为此,评论要么以* 开头,要么评论像这样开头。 请注意此 cmets 仅在函数开始之前。 if 条件通常在函数之后用右括号终止。

      ...
      call :Sub1
      
      if :Sub == begin ( * begin :Sub1
        this will begin Sub1
       :Sub1
        4> "test.txt" (
          >&4 echo this is a test
        )
        exit /b
      if :Sub == END * END :Sub1 )
      
      ...
      

      这也可以用于,例如,在版本变更的情况下。

      ...
      if :new == begin * begin Version 2.1
      ... new code
      if :new == END * END Version 2.1
      ...
      

      查看它的最佳方式是如何使用 cmets 使其发挥最大作用,以及它是否对您有用。 第二个方面是,您还可以理解其他人编写的批次。以及您使用 cmets 为您正确记录您的代码。它也适合你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-31
        • 2015-02-21
        • 1970-01-01
        • 2017-04-20
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        相关资源
        最近更新 更多