在Windows批处理脚本中@的含义是什么?

时间:2013-03-21 15:33:08

标签: batch-file

让我从RubyInstaller获取bundle.bat个文件来代表一个例子。

@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"ruby.exe" "C:/Ruby200/bin/bundle" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"ruby.exe" "%~dpn0" %*

我不明白这一点:

  1. 此处@的含义为@"ruby.exe",双引号的含义是什么?
  2. 这里in the manual我找到了一些解释:

      

    说明 - 第一行阻止命令   显示,“@echo off”中的@保持 行显示。

    这是我的两个测试脚本。

    第一个:

    @ECHO OFF
    @ECHO "123"
    ECHO "123"
    PAUSE
    

    输出:

    C:\win>batch.bat
    "123"
    "123"
    

    @不会阻止显示行。

    第二个:

    我想从批处理文件中调用gem environment命令。在这里,我遵循bundle.bat文件中的代码。我的代码:

    @ECHO OFF
    @"gem environment"
    PAUSE
    

    输出是错误的。请注意两个双引号:

    ""gem environment"" is not a command or executable or package file.
    

    但在bundle.bat中,@"ruby.exe" "%~dpn0" %*行有效。

    现在我改变了我的剧本:

    @ECHO OFF
    REM Call like this...
    @gem environment
    REM or call like this.
    gem environment
    PAUSE
    

    两者都很好。输出:

    RubyGems Environment:
      - RUBYGEMS VERSION: 2.0.3
      - RUBY VERSION: 2.0.0 (2013-02-24 patchlevel 0) [i386-mingw32]
      - INSTALLATION DIRECTORY: C:/Ruby200/lib/ruby/gems/2.0.0
      - RUBY EXECUTABLE: C:/Ruby200/bin/ruby.exe
      - EXECUTABLE DIRECTORY: C:/Ruby200/bin
      ... and so on
    

    所以我的问题是:

    1. 批处理脚本中@字符的含义是什么?
    2. 我何时必须在@之后重复引用该值?

1 个答案:

答案 0 :(得分:7)

问题1

Q1。批处理脚本中@字符的含义是什么?

@字符确实会阻止显示该行。如果有的话,它不会阻止显示行的输出

例如:

echo foo

会显示:

echo foo
foo

但是像这样添加@

@echo foo

你得到的就是输出:

foo

转为echo off后,@无用,因为无论如何都没有显示任何行。


问题2

Q2。我何时必须在@?

之后双引号

示例代码中的双引号与@无关。所有@都会导致该行无法显示。

双引号对于指向其路径中包含空格的文件很有用。例如,如果您尝试运行如下程序:

C:\Program Files\foo.exe

shell只会将其解析到第一个空格,因此它会查找名为C:\Program的文件或命令,并返回错误。

将其更改为:

"C:\Program Files\foo.exe"

它将正确查找C:\Program Files\foo.exe并运行它(如果存在)。

在您的情况下,如果您只是说gem environment,它可以找到名为gem.exe的程序并传入environment作为参数。但如果你引用它"gem environment",它就会找到一个名为gem environment.exe的东西。