将REM设置为变量以使代码看起来不同

时间:2017-04-14 11:05:24

标签: windows batch-file variables cmd

最近我开始将行注释为double ::,但我意识到它可以在长时间内做出的问题"对于"或"选择"脚本和问题" 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

2 个答案:

答案 0 :(得分:3)

这不是问题,不管怎么说。

该变量实际上充当了宏,我经常使用该技术(尽管不是备注)。批处理解析器在解释代码逻辑之前扩展变量中的代码,因此它的功能与您希望/期望的完全相同。

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

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

答案 1 :(得分:1)

当我在批处理中写一个rem注释时,我把它留空了比当前代码缩进更多的空白。 因为我的代码缩进是2个空格,所以对我来说这样的可读性很快就会落入眼中。

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

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

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

对于不应该显示两次的其他调试,我使用变量%mon%。这个我把回声关闭到回声和回声到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 doublecolon开头的注释不会在循环括号内开始。让人们在循环包中做到这一点。 这些::注释通常是对被调用的批处理或函数的解释。

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

%== loop commentaries %主要用于编码概述。

我使用的另一种评论是if-loop评论。其中也用于调试,但仅用于镜像一次的功能。为此,评论要么以*开头,要么评论就像这样开始。 请注意此注释仅适用于函数开始。 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 )

...

例如,在版本Alteration的情况下也可以使用它。

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

最好的方法是如何使用评论以及它是否对您有用。 第二个方面是你也可以理解他们编写的其他批次。除此之外,您还可以使用注释为您正确记录代码。它也适合你。