Win7 命令行管道

Win7 命令行管道

我想知道为什么在命令行提示符中会发生这种情况。

fileX.cmd我有一个只有一行文本的脚本:

@echo dir

如果我做

C:\Users\Dogfood>fileX.cmd | cmd

这将显示目录中的所有文件,但是......

C:\Users\Dogfood>type fileX.cmd | cmd

没有。命令提示符打开了一个新的 cmd,但询问我“ More?

为什么 fileX.cmd 的内容没有像第一行一样通过管道传输到管道右侧的 cmd 中?(即fileX.cmd | cmd

答案1

到 cmd 的管道| cmd将执行其输入流中的任何命令。

  • 在第一种情况下,输入流将包含 的输出fileX.cmd,即dir,这就是| cmd将执行的。
  • 在第二种情况下,输入流将包含@echo dir,因此您应该只看到文本dir

More?如果在 中的命令末尾没有换行符,我会得到fileX.cmd。 造成这种差异的原因是,当到达 EOF 时,主 shell 会将命令视为完成,而管道末尾的 cmd 需要完整的行。 如果您想知道为什么应该这样,您必须询问 Microsoft。

(顺便说一句,您的描述是指fileX,而不是fileX.cmd,并且您说它包含一行,而我怀疑它包含一行不完整的行。)

答案2

你需要记住管道需要输出命令的第一部分并将其传递给下一个命令。

让我们来fileX.cmd | cmd分析一下:

filex.cmd = @echo dir

如果我们在命令行中输入 @echo dir,我们会看到输出为dir。Echo 只是输出 echo 命令后面的内容。输出不会被执行,只是显示出来。

在命令提示符下输入 filex.cmd 并按回车键,我们将得到输出dir。这与上一个语句没有什么不同,只是命令在批处理/cmd 文件中。

如果我们添加| cmd,那么我们看到的结果会有所不同,我们会得到一个目录列表。为什么?因为 filex.cmd 的输出是,dir并且我们将其传递dir给命令提示符,命令提示符会获取该输出并执行它,从而为我们提供目录列表。

那么为什么第二个命令不执行相同的操作?原因是,您使用的是命令typeType将文本显示到屏幕上。如果您的目录列表很短,它本来可以工作。但是,您的目录列表会滚动出屏幕,因此命令type会暂停输出并询问您是否需要more?。该问题more?现在是输出并被传递给命令提示符。

请注意,如果您的目录列表较短,type则不会要求更多,并且命令将如何工作会预料到的。在仅包含少量目录和文件的目录中尝试相同的命令,您会看到差异。

相关内容