我想知道为什么在命令行提示符中会发生这种情况。
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
给命令提示符,命令提示符会获取该输出并执行它,从而为我们提供目录列表。
那么为什么第二个命令不执行相同的操作?原因是,您使用的是命令type
。 Type
将文本显示到屏幕上。如果您的目录列表很短,它本来可以工作。但是,您的目录列表会滚动出屏幕,因此命令type
会暂停输出并询问您是否需要more?
。该问题more?
现在是输出并被传递给命令提示符。
请注意,如果您的目录列表较短,type
则不会要求更多,并且命令将如何工作你会预料到的。在仅包含少量目录和文件的目录中尝试相同的命令,您会看到差异。