首页 > 解决方案 > 管道似乎不适用于 cd | cmd中的资源管理器

问题描述

我一直在学习批处理脚本,所以我遇到了管道和 I/O 重定向。

如果这有效:

tasklist | find "winword"

为什么不这样做:

cd | explorer

我希望这个命令在当前工作目录中打开资源管理器,因为cd没有任何参数输出当前目录和:

explorer %directory%

在 中打开资源管理器%directory%

我在这里做错了什么吗?

标签: windowsbatch-filecmdpipe

解决方案


打开命令提示符窗口,键入find "blah"并按Enter;您会看到它等待用户/键盘/控制台输入,STDIN指向的输入(按Ctrl+ZEnter以结束提示)。然后输入echo blah并按Enter;您会注意到文本blah已打印,因此有显示/控制台输出;这是由STDOUT指出的。管道从左侧命令获取STDOUT|处的数据,并将其重定向到右侧命令的STDIN

现在输入explorer命令提示符窗口;当然会弹出一个资源管理器窗口,但是在命令提示符中会发生什么?对,没什么,它不等待STDIN的任何输入。因此,您可以通过管道传输到它,但它不会在意,因为它不会在STDIN读取。事实上,GUI 应用程序通常不使用STDINSTDOUT,因为这些东西是为命令行应用程序设计的。

又一个例子:在命令提示符窗口中,输入echo C:\Windows; 很明显会发生什么;然后输入echo C:\Windows| dir;怎么了?dir返回当前目录的内容,但不返回C:\Windows. 为什么?好吧,让我们dir先输入,看看会发生什么:是的,dir显示当前目录的内容,并且它不等待控制台输入;所以在管道的右侧,它在STDIN接收数据,但它根本不在乎。您可以尝试使用dir "C:\some\other\folder", without 和 with 管道,输出是一样的,这里忽略了STDIN 。

echo/dir示例还演示了控制台输入(STDIN )和命令行参数或参数之间的区别:命令行中的路径dir "C:\some\other\folder"就是这样一个参数,您不能用来自STDIN的数据替换它。要了解原因,您需要区分解析时间(解释器读取和解析命令时)和运行时(实际执行命令时):参数必须在解析时出现,而STDIN仅相关在运行时,即稍后。所以我们可以说他们只是从未见面。

这也反映了您尝试的情况:后者接受命令行参数(无论如何都需要在执行之前cd | explorer可用,因此在解析时),但它不关心STDIN。此外,来自的STDOUT数据在执行之前不可用(但仅在运行时),所以无论如何它到达得太晚了......cd


推荐阅读