windows - 管道似乎不适用于 cd | cmd中的资源管理器
问题描述
我一直在学习批处理脚本,所以我遇到了管道和 I/O 重定向。
如果这有效:
tasklist | find "winword"
为什么不这样做:
cd | explorer
我希望这个命令在当前工作目录中打开资源管理器,因为cd
没有任何参数输出当前目录和:
explorer %directory%
在 中打开资源管理器%directory%
。
我在这里做错了什么吗?
解决方案
打开命令提示符窗口,键入find "blah"
并按Enter;您会看到它等待用户/键盘/控制台输入,STDIN指向的输入(按Ctrl+Z和Enter以结束提示)。然后输入echo blah
并按Enter;您会注意到文本blah
已打印,因此有显示/控制台输出;这是由STDOUT指出的。管道从左侧命令获取STDOUT|
处的数据,并将其重定向到右侧命令的STDIN。
现在输入explorer
命令提示符窗口;当然会弹出一个资源管理器窗口,但是在命令提示符中会发生什么?对,没什么,它不等待STDIN的任何输入。因此,您可以通过管道传输到它,但它不会在意,因为它不会在STDIN读取。事实上,GUI 应用程序通常不使用STDIN和STDOUT,因为这些东西是为命令行应用程序设计的。
又一个例子:在命令提示符窗口中,输入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
推荐阅读
- python - 如何使用 re.sub 根据模式字典和 python 中的替换值替换文本的某些部分?
- html - 图像与内容重叠在容器顶部
- python - 在 Python3 中读取压缩 excel 时的 unknown_codepage_21010
- corda - 反序列化错误:无法构造 Dto 的实例(尽管至少存在一个 Creator):无法从 Object 值反序列化
- vue.js - 增加折线图和图例 ChartJS 之间的差距
- javascript - 如何在innerHTML中插入子元素
- html - 如何在 Angular 应用程序中播放视频?我的代码不起作用
- android - 如何使用视图模型绑定 Spinner 数据(DataBinding)
- python - python中“import tensorflow”的加载时间大不相同
- php - laravel 6登录成功但重定向到登录页面