【问题标题】:What does :: (double colon) mean in DOS batch files?::(双冒号)在 DOS 批处理文件中是什么意思?
【发布时间】:2013-05-14 00:11:20
【问题描述】:

我找到了这个程序web.archive.org: http://baiyunmanor.com/blog/work/get-current-date-time-in-dos-batch-file/

::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: This uses Windows Scripting Host to set variables
:: to the current date/time/day/day_number
:: for Win9x/ME/NT/W2K/XP etc
:: Thanks go to Todd Vargo for his scripting
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
set TmpFile=”%temp%.\tmp.vbs”
echo> %TmpFile% n=Now
echo>>%TmpFile% With WScript
echo>>%TmpFile% .Echo “set year=” + CStr(Year(n))
echo>>%TmpFile% .Echo “set yr=” + Right(Year(n),2)
...
cscript //nologo “%temp%.\tmp.vbs” > “%temp%.\tmp.bat”
call “%temp%.\tmp.bat”
...
echo date F [ddmmyy] [%day%%month%%yr%]
:: datetime.bat

但我不知道这条线是什么

:: datetime.bat

到底是什么意思?

【问题讨论】:

  • 注意在任务计划程序调用的批处理程序中使用 :: as rem。在编写和测试批处理程序时,它在命令提示符下按预期工作,但是从任务计划程序运行相同的东西时,它会抛出错误:“如果”不是内部或外部命令、可运行程序或批处理文件。跨度>

标签: batch-file


【解决方案1】:

:: 是一个标签(不准确地也称为 comment 标签)在实践中可以像 REM 一样被视为一个评论,因为它是一个“un-goto-able” "标签。

不过,REM:: 之间存在一些差异。主要有:

  • ECHO ON 显示 REM 行,但未显示带有 :: 注释的行

  • :: 可以执行行尾插入符号(即,^ 在以:: 开头的行末尾使下一行成为注释):

     :: This is a comment^
     echo but watch out because this line is a comment too
    
  • 标签和:: 具有特殊的逻辑,可能会导致括号块出现问题 - 在( ) 中使用它们时要小心。示例:

     for %%D in (hi) do (
         echo Before...
         :: My comment
         :: Some other comment
         echo After...
     )
    

    输出:

     Before ...
     The system cannot find the drive specified.
     After...
    

【讨论】:

  • 当您引用 ::“也称为 评论标签”时,您应该包含指向您获得该引用的 官方 来源的链接;否则你就是在传播可能是错误的流行信仰
  • 最重要的区别是括号块内部的特殊逻辑。如果您可以添加资源以获取更多信息,那就太好了。
  • 哇,我在 for 循环中使用了 :: ,我花了一整天的时间才看到这篇文章。在我的情况下, () 中双冒号的行为似乎不确定。如果它只是在 for() 中,它要么崩溃执行,要么说“......找不到指定的驱动器”(为此,不同的语言),而“chdir”清楚地表明我的“cd”工作。
【解决方案2】:

以双冒号开头的行代表一个无效标签,它被命令处理器忽略,所以它可以用于插入注释。由于无法追踪的原因,许多人使用:: 在批处理文件中插入 cmets,但您必须注意,在 Koterpillar 的答案中给出的链接中描述了它的使用存在几个陷阱。似乎第一次使用:: 而不是REM 命令的目的是为了加快批处理文件在慢机器(即:软盘)中的执行,但这个原因不是使用的有效理由多年前的双冒号。

任何包含无效标签的行都将被命令处理器忽略,您实际上可以使用任何特殊字符来生成无效标签。例如:

@echo off

:~ This is a comment
:` This is a comment
:! This is a comment
:@ This is a comment
:# This is a comment
:$ This is a comment
:% This is a comment
:^ This is a comment
:& This is a comment
:* This is a comment
:( This is a comment
:) This is a comment
:_ This is a comment
:- This is a comment
:+ This is a comment
:= This is a comment
:{ This is a comment
:} This is a comment
:[ This is a comment
:] This is a comment
:| This is a comment
:\ This is a comment
:: This is a comment
:; This is a comment
:" This is a comment
:' This is a comment
:< This is a comment
:> This is a comment
:, This is a comment
:. This is a comment
:? This is a comment
:/ This is a comment

echo OK

换句话说:如果你想插入评论并且不想使用REM 命令(虽然我想不出任何理由这样做),你有32 种可能的字符组合可以这样做。为什么你应该使用这个:::?仅仅因为一些 35 年前写的老程序做到了?

【讨论】:

  • 你是对的(几乎总是如此),但我不明白你为什么要列出这个列表? "~``!@#$%%*()_-{}[]\'.?/^&amp;|&lt;&gt;是合法标签,只有+=,;:&lt;space&gt;不能用作标签。
  • 既然你想不出原因,我给你两个:可读性:: 在批次中大部分是字母字符中突出为非字母字符脚本......如果你来自 C++,其中 // 是单行注释,:: 对同样的目的有点意义)和 节省空间 (如果你曾经打过大小限制 - 超过 60 kB - 使用脚本能够节省一些字节,您会很高兴......是的,如此大的单体脚本也有很好的理由)。
  • @0xC0000022L:您似乎没有阅读我的帖子或我的评论。如果您想要可读性并且您来自 C++,那么 :// 插入单行注释更有意义!从这个角度来看,为什么不使用:'像VBScript,或者:#像PowerShell和其他几种脚本语言,或者:--像SQL,或者:&lt;--像HTML等等。 . 换句话说:如果你想插入一个评论并且你有32个可能的字符组合可供选择,为什么你应该使用这个:::::的选择没有reasonable=acceptable=logical原因
  • @Aacini:我确实读过它,它提示我发表评论。在您的五个备选方案中,全部:: 需要更多的手指运动,更糟糕的是,五分之三的人使用两个以上的字符。现在,虽然这是一个合乎逻辑的解释,但我对“合理”或“可接受”无能为力,因为这些完全是主观的。但在这些替代方案中,:// 对我来说是最能接受的,如果我也不能选择使用 ::
  • REMREM /?a=1 ("1 was unexpected at this time.") 这样的 cmets 会出错,而 :: 似乎可以很好地处理它们。
【解决方案3】:

以冒号开头的行是一个标签,你可以用goto跳转到:

goto end
:end

以双冒号开头的行是一个标签,除非你不能,甚至不小心,跳到它:

goto :end REM this doesn't work
::end

因此,双冒号用于注释行。

来源:http://www.robvanderwoude.com/comments.php

【讨论】:

    【解决方案4】:

    正如acdcjunior 提到的标签和:: 具有特殊的逻辑,可能会导致括号块中的问题

    这里有几个示例

    示例 1

    IF 1==1 (
      ::
    )
    

    样本 1 的输出

    ) was unexpected at this time.
    

    示例 2

    IF 1==1 (
      ::
      ::
    )
    

    样本 2 的输出

    The system cannot find the drive specified.
    

    【讨论】:

      【解决方案5】:

      冒号 (:) 是标签标记,可用于获取指令。

      有些人也使用 : 作为注释,所以双冒号只是一种风格上的 REM 语句

      【讨论】:

        【解决方案6】:

        如果您使用传统的REM 命令注释掉 DOS 批处理脚本中的一行,那么注释中的任何输出重定向仍然会完成。例如,考虑这个脚本:

        echo 1 > a.txt
        rem echo 2 > b.txt
        echo 3 > c.txt
        

        此脚本将截断 b.txt,即使该行似乎已“注释掉”。

        使用像双冒号这样的无效标签前缀将禁用任何重定向。

        【讨论】:

        • 对不起,这是错误的,至少从 MS-DOS6.22 开始。 REM 甚至比标签 cmets。如果使用了REM,解析器将停止解析一行,但对于标签则不会
        • @jeb:我刚刚在 FreeCOM 上试过,rem &gt; a 确实创建了文件a。所以至少 FreeDOS 确实为rem 命令做了重定向。今天晚些时候我可以在我的 MS-DOS 机器上进行测试。
        • @jeb:我记得我可以试试on pcjs。加载 MS-DOS 6.22 软盘,重新启动,退出安装程序,执行rem &gt; a,然后dir a 列出从此重定向创建的文件。
        • 你是对的,我错了,即使使用 Window98,REM 重定向仍然有效(也经过测试)。但我将问题编辑得更准确,因为示例代码至少需要 Windows NT
        • @jeb:它不期望“至少是 Windows NT”,它是“用于 Win9x/ME/NT/W2K/XP”的。在 MS Windows 4.x(95/98/Me 行)中,批处理文件实际上是由 DOS 的 command.com 解释的,并且,正如您所测试的,这个 shell 确实在 rem 行上进行了重定向。因此,即使没有理由更喜欢 :: 而不是 remcmd.exe 的 MSW NT,那么问题仍然包括存在这种差异的“Win9x/ME”。
        猜你喜欢
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 2013-09-23
        • 2011-01-17
        • 2016-12-23
        相关资源
        最近更新 更多