在命令行中,"@"的意思是什么?
在命令行中,"@"的意思是什么?
我从Unreal Build Tool中找到了一些执行命令:
C:\VisualStudio\IDE2017\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\cl.exe @"C:\MessageTag\Intermediate\Build\Win64\MessageTest\Development\DesktopPlatform\Module.DesktopPlatform.cpp.obj.response" /showIncludes
我用一个简单的命令行进行了测试:
cl @"F:\x\cc.txt"
cc.txt文件的内容如下:
x.cpp -Fe"y.exe"
生成了y.exe,并且看起来文件"cc.txt"中的行被链接成了一个字符串。
然而,如果我简单地在命令行中输入以下内容:
@"F:\x\cc.txt"
文本文件会被打开,既不显示文件内容,也不执行文件内容的第一行。
"@"到底是做什么用的?有相关的文档吗?
进一步的问题:这只适用于cmd命令行。有PowerShell的等效命令吗?
在命令行中,"@"符号具有不同的含义和用法。首先,当在命令行中调用"cl.exe"时,以"@"为前缀的文件名表示一个"response file",这是一个包含通常用作命令行参数的文本文件,"在命令行参数超过127个字符时非常有用"。
在PowerShell中,"@"是一个元字符(具有特殊含义的字符),需要将其转义为"`@"或将其作为引用字符串的一部分,这在cmd.exe或批处理文件中也可以工作:
# PowerShell # 将@转义为`@ cl `@"F:\x\cc.txt" # 或者,将@作为引用字符串的一部分, # 这在cmd.exe或批处理文件中也可以工作。 cl ":\x\cc.txt"
上述对于"@"的使用,作为参数的一部分,是特定于所调用的程序"cl.exe"的。
相比之下,在命令的开头使用"@"始终由调用的shell(cmd.exe或PowerShell)进行解释:
- cmd.exe:命令开头的"@"会抑制在打印输出之前打印该命令(就像在执行之前执行"echo off"一样,但作用范围仅限于该命令)
- 因此,仅执行"@"F:\x\cc.txt",会执行"F:\x\cc.txt",而不会首先打印执行的命令。(注意,如果没有"@ ",则仅在从不以"off"开始的批处理文件中执行时才会打印该命令。)
- PowerShell:在语句开头的"@"只能启动以下构造之一:
- 一个here-string(@"
- 一个数组子表达式操作(@(
- 因此,尝试仅执行"@"F:\x\cc.txt"将导致语法错误。
"@"符号在命令行中具有不同的含义和用法,具体取决于所调用的程序和shell的不同。