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

Gre*_*een 2 batch-file

让我bundle.batRubyInstaller中获取文件来表示一个例子.

@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" %*
Run Code Online (Sandbox Code Playgroud)

我不明白这个:

  1. @这里的意思是@"ruby.exe"什么,双引号是什么意思?

本手册中,我发现了一些解释:

说明 - 第一行阻止显示命令,"@ echo off"中的@使 行不显示.

这是我的两个测试脚本.

第一个:

@ECHO OFF
@ECHO "123"
ECHO "123"
PAUSE
Run Code Online (Sandbox Code Playgroud)

输出:

C:\win>batch.bat
"123"
"123"
Run Code Online (Sandbox Code Playgroud)

@ 不会阻止显示行.

第二:

我想gem environment从批处理文件中调用命令.在这里,我受到来自bundle.bat文件的代码的指导.我的代码:

@ECHO OFF
@"gem environment"
PAUSE
Run Code Online (Sandbox Code Playgroud)

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

""gem environment"" is not a command or executable or package file.
Run Code Online (Sandbox Code Playgroud)

bundle.bat在线上@"ruby.exe" "%~dpn0" %*工作.

现在我改变我的脚本:

@ECHO OFF
REM Call like this...
@gem environment
REM or call like this.
gem environment
PAUSE
Run Code Online (Sandbox Code Playgroud)

两者都很好.输出:

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
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. @批处理脚本中字符的含义是什么?
  2. 我什么时候必须在之后双引号@

Nat*_*man 7

问题1

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

@角色确实阻止了线的显示.如果有的话,它不会阻止显示行的输出.

例如:

echo foo
Run Code Online (Sandbox Code Playgroud)

会显示这个:

echo foo
foo
Run Code Online (Sandbox Code Playgroud)

但添加@如下:

@echo foo
Run Code Online (Sandbox Code Playgroud)

而你得到的只是输出:

foo
Run Code Online (Sandbox Code Playgroud)

一旦你转动echo off,这@是没用的,因为无论如何都没有显示任何线条.


问题2

Q2.我何时必须在@之后加倍引用该值?

示例代码中的双引号与@.所有这些@都会导致不显示该行.

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

C:\Program Files\foo.exe
Run Code Online (Sandbox Code Playgroud)

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

把它改成这个:

"C:\Program Files\foo.exe"
Run Code Online (Sandbox Code Playgroud)

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

在你的情况下,如果你只是说gem environment,它可以找到命名的程序gem.exeenvironment作为参数传入.但如果你引用它,"gem environment"它正在寻找一些名字gem environment.exe.