使用管道字符的命令输出重定向

时间:2016-06-25 16:37:15

标签: batch-file command-line cmd

我试着理解输出重定向到另一个命令是如何工作的。

我知道如果第二个命令是 find ,可以使用它作为帮助文本来明确说明。它也可以与 findstr 一起使用 findstr的帮助文本没有说明这一点。

所以问题是:

我怎么知道其他windows命令shell命令接受另一个命令的输出?

我已经创建了一个命令行,我希望输出为" 18:33"但它不起作用

C:>time /T | set /P a= && echo %a%
%a%

C:>setlocal enabledelayedexpansion
C:>time /T | set /P a= && echo !a!
!a!

为什么这不能按预期工作?

请注意,这里的要点是读取变量的时间。我只是不知道管道如何对find或findstr以外的任何东西有用。

3 个答案:

答案 0 :(得分:3)

几乎所有接受输入的命令也可以与管道一起使用。

此外,SET /P的样本也可以使用,但需要注意 我这里不使用延迟扩展,因为它只增加了更多的复杂性。

time /T | ( set /P var= && set var )

括号在这里很重要,否则隐含的顺序是

( time /T | set /P var= ) && set var

但这失败了,因为管道为双方创建了两个新的cmd.exe实例 在两个任务结束后,这些实例将再次被删除 因此,只能访问由同一(新)实例内的管道创建的变量。

对于许多情况,管道可用于自动化一些简单的问题,如

echo Y | del *

有关管道和SO:Why does delayed expansion fail when inside a piped block of code?

延迟扩展的更多信息

答案 1 :(得分:1)

从文件中读取数据的命令通常但不总是支持从句柄 STDIN 读取数据。管道字符|重定向写入的输出以处理应用程序A的 STDOUT 以处理应用程序B的 STDIN 。有关详细信息,请阅读Microsoft文章{{3关于Using command redirection operators的SS64文章。

哪些控制台应用程序支持来自 STDIN 的输入是文档问题。 Windows中只安装了一些控制台应用程序,支持 STDIN 的输入。但是有很多第三方控制台应用程序支持来自 STDIN 的输入。他们中的许多人没有在文档中明确说明输入也可以从 STDIN 读取,而不仅仅是从指定为参数的输入文件中读取。但是,通过一次试验,可以非常快速地找到对来自 STDIN 的数据输入的支持。

FIND FINDSTR 中支持 STDIN 的标准Windows控制台应用程序例如 MORE < / strong>和排序

cmd.exe的大多数标准Windows控制台应用程序和内部命令都不处理文件内容,因此不支持 STDIN 。有关Windows标准命令的列表,请参阅Redirection。但是,有关Windows标准命令行命令的更多详细信息可以在Microsoft's command-line reference链接的网页上找到。

从应用程序的 STDOUT 重定向到另一个应用程序的 STDIN 经常与第三方控制台应用程序一起使用,因为其中许多应用程序支持来自 STDIN <的输入/ strong>即可。每个编译器/脚本解释器都将消息写入 STDOUT ,并将致命错误消息写入 STDERR ,这些消息由许多GUI文本编辑器和IDE应用程序重定向,用于捕获,过滤和打印这些消息到程序员的GUI窗口。此重定向使用与Windows命令解释程序提供的重定向操作符>>>以及|相同的机制完成。

通常,支持键盘支持输入的所有控制台应用程序也从输出或其他应用程序或文件重定向的 STDIN 输入。但是一如既往有例外,例如某些设计应用程序只接受来自键盘的输入,而不是来自句柄 STDIN ,例如由于安全原因,例如应用程序或脚本不应该确认/输入内容,但是通过键盘真正的人类用户。

命令 SET 用于为环境变量赋值,或者将1个或多个环境变量的值输出到 STDOUT ,或者计算算术表达式,或者提示批处理用户从 STDIN 读取字符串。此命令不适用于从文件读取或写入文件。

但是,可以使用set /P将应用程序的输出重定向到环境变量,并在其答案中描述SS64.com - A-Z index of the Windows CMD command line所述的特殊语法。但这种方法很少使用,我认为原因是所需表达式的复杂性。

但是,演示代码用于将当前时间分配给环境变量。通常有一个命令参数或其他功能,可以避免将文本重定向到命令或控制台应用程序的 STDIN 。这也是获取当前时间为值的环境变量的情况。

预定义的环境变量 DATE TIME 。在命令提示符窗口set /?中运行并阅读输出帮助的所有页面。在最后一页中,列出了批处理文件中经常需要的一些特殊环境变量,其中包含 DATE TIME 的解释。

尝试

echo Current date is %DATE% and current time is %TIME%

请注意%DATE%%TIME%返回的日期和时间字符串格式取决于Windows区域和语言设置(国家/地区)中的当前设置。因此,仅当批处理文件始终在同一台计算机上执行时才使用%DATE%%TIME%,而日期/时间格式是众所周知且不会更改的。否则最好使用wmic.exe OS get localdatetime。有关Windows上日期/时间使用的更多详细信息,请参阅jeb上的答案。

命令 FOR 可用于将应用程序的字符串输出分配给一个或多个环境变量。在命令提示符窗口for /?中运行以获取有关此命令的帮助。使用 FOR 的方法通常用于将应用程序的输出或从文件读取的文本分配给环境变量。

批处理文件示例:

@echo off
for /F %%I in ('time /T') do set "a=%%I"
echo Time is %a%

答案 2 :(得分:1)

简短的回答是因为窗户搞砸了。

没有充分的理由说明上面的命令不起作用,而且微软完全应该受到责备。他们的软件通常不仅无法工作,而且实际上无法以完全荒谬的方式工作,并且没有任何错误信息暗示可能出错的情况,从而浪费了人们的时间。如果你想要一个通常有效的命令提示,并且如果它不起作用,通常是由于你的错误而不是它的错误,试试Linux。

据说,在Windows命令提示符下有几个命令可以处理它们的标准输入; sort命令是我想到的命令。试试type text.txt | sort,看看会发生什么。

要回答你的问题&#34;我怎么知道?&#34;,答案是你无法知道,因为我不认为有一个处理标准输入的所有命令的综合列表。但是,通常,如果命令对输入文件进行操作,并且需要将输入文件名指定为参数,并且此参数是可选的,则可以非常安全地假设如果省略该参数,则命令将处理其标准输入。

此外,通过将con指定为输入文件名,可以欺骗接受输入文件名作为非可选参数的命令,以使用标准输入。因此,例如,单独输入type不起作用,但请尝试type con并查看会发生什么。