如何在批处理文件或命令提示符中使用“ <<”?


12

我知道>>它的用途是什么,它将所有消息写入文件而不是屏幕。我<<想做相反的尝试,我尝试并收到一条消息:<< was unexpected at this time.

请告诉我用的是什么<<以及如何使用。

Answers:


17

标准的Windows命令外壳- cmd.exe-不使用<<运营商在所有

单个对<表示“将文件读入标准输入cmd.exe,但是两个<字符对于背对背是没有意义的cmd.exe,因此会给出您得到的错误。

<<运算符对于Unix命令外壳的所有主要类型都有意义,在此用于此处文档:²

$ some-command <<END
blah blah blah
blah blah
blah blah blah blah blah
END

这三行被发送到some-command其标准输入。

这对于将大量文本发送到命令中而不用先将其写入文件(如您必须与<操作员一样)很有用。我经常使用它在脚本中嵌入“使用”消息:

#!/bin/sh
if [ -z "$1" ]
then
    cat <<USAGE
usage: myscript <files...>

     Grobbles the foobie for all files given on the command line.

USAGE

    exit 1
fi

# ... do something with command line arguments

这比编写一堆echo语句要好,因为Heredoc文本的格式设置与打印到屏幕上时完全相同。此外,在这种情况下,更容易处理空格,引用,重定向和变量插值。请注意,例如,我在用法消息中使用了尖括号,而不必做任何巧妙的事情来防止shell尝试将其用于I / O重定向。

如果要在Windows上执行此类操作,则可以安装Cygwin并使用其外壳之一。如果您使用的是Windows 10,则可以改用WSL


脚注:

  1. 该链接进入已归档的Windows XP文档树。Microsoft在归档这些文档时断开了我以前使用的链接,因此如果再次断开它,这里是备份的第三方参考。

    cmd.exe我在microsoft.com上知道的唯一其他参考资料是Windows Commands PDF(4.9 MB,948页),仅能为大多数(!)内置和Microsoft提供的外部命令提供参考。您可以在cmd提示时给出。该PDF基于两个方面是不完整的。首先,也是最相关的,这里没有关于重定向如何在cmd.exeShell中工作的综合讨论。甚至没有关于外壳语法的讨论。其次,PDF的命令列表不完整:我碰巧要检查的第一件事未涵盖:diskpart

    我相信在座的来自微软的明确尝试这个如下,以取代cmd.exePowerShell中,已经已经持续了很多年。在撰写本文时,Windows 10的最新更新中,他们还采取了进一步的步骤来隐藏的存在cmd.exe,尽管尚未完全消失。

    值得注意的是,PowerShell还不支持<<重定向运算符。同样,从Unix shell退缩之后,cmd.exe它也不支持<重定向!

  2. 就像我在上面写的那样,开始此处文档的规范方法是,与<<分隔符之间没有空格。我的模糊回忆是,我在shell脚本中看到的对here-documents的所有使用也都是通过这种方式完成的。此处文档的POSIX规范在其示例中也使用此样式。

    但是,仔细阅读POSIX.1-2008规范的其他部分后发现,在<<和分隔符之间放置一定数量的空格或制表符是合法的。具体地,请参阅令牌识别规则7和10,定义io_here所述壳语法,和的定义的“空白”字符类

    就是您记录壳的方法。做笔记,微软。;)

    在Bash 4上进行测试,并ksh93确认它可以按预期工作。


我自己不能说的更好。除非我不会提到Cygwin,因为您在Windows中做的只是其他事情,而在Unix中做的只是其他事情。有很多的交叉兼容性,但是我强烈建议您学习原始Unix,而不是像Cygwin或其他一些基于Win的实用程序这样的虚拟工作。
6

8
@BiTinerary:鉴于每天都有大量人专门使用Cygwin以便能够在Windows上做类Unix的事情,我想我会在答案中留下这个暗示。
沃伦·杨

是的,我的意思不是贬低Cygwin的真实性,我该不时地将它用于平凡的任务。我只是投入两分钱来启动真实的东西,并且了解到(特别是对于初学者而言)比学习第三者或分拆必须遵循完全不同的操作系统的原始版本更好。我只是想说,在设置Cygwin所需的时间,指定所有包含的模块并开始使用它的过程中,您可能已经学到了很多东西。我觉得Cygwin是您使用过的,并且不想重启后使用
BiTinerary 2015年

Nit:(Unix)heredoc无法识别重定向和管道,但是默认情况下,DOES可以识别参数/变量替换和进程替换(dollar-parens和backticks语法);禁止使用反斜杠在数据中添加反斜杠或在命令行上引号(至少一个字符)。
dave_thompson_085


4

> 写入一个新文件。

>> 附加到文件

< 从文件读取

| 将命令输出发送到另一个命令的输入中

请参阅此处的列表。在cmd.exe中键入%^是Windows复活节彩蛋吗?

自从发布以来,已经添加了它。

Starting a Program
===============

See start /? and call /? for help on all three ways.

Specify a program name
--------------------------------

    c:\windows\notepad.exe

In a batch file the batch will wait for the program to exit. When
typed the command prompt does not wait for graphical
programs to exit.

If the program is a batch file control is transferred and the rest of the calling batch file is not executed.

Use Start command
--------------------------

    start "" c:\windows\notepad.exe

Start starts a program and does not wait. Console programs start in a new window. Using the /b switch forces console programs into the same window, which negates the main purpose of Start.

Start uses the Windows graphical shell - same as typing in WinKey + R (Run dialog). Try 

    start shell:cache

Use Call command
-------------------------

Call is used to start batch files and wait for them to exit and continue the current batch file.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.