找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32472|回复: 10

[系统相关] 【已解决】管道命令后的find不能准确显示查找的数据

[复制链接]
发表于 2017-1-23 16:20:23 | 显示全部楼层 |阅读模式
问题是这样的:
我用
  1. tasklist|find /i "qq"
复制代码
命令,屏幕上不显示任何信息。(命令提示符窗口和bat文件都一样)
用findstr 可以正常显示。
  1. tasklist|find /i "qq">a.txt
复制代码
然后
  1. type a.txt|find /i "qq"
复制代码
也可以显示,直接
  1. find /i "qq" a.txt
复制代码
也可以显示。
  1. for /f "delims=" %a in ('tasklist^|find /i "qq"') do @echo %a
复制代码
也行。
就是
  1. tasklist|find /i "qq"
复制代码
不行,什么都不显示。(实际上tasklist里面关于qq的进程有3个。)
———————
然后群里朋友传了find.exe给我,我用新的find.exe还是不成功。
另一个朋友又传了个cmd.exe给我,依然不行。
所以,请问这个可能是什么原因呢 ?
(电脑是xp系统)

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2017-1-24 19:23:53 | 显示全部楼层
  1. tasklist | C:\Windows\System32\find.exe /i "qq"
复制代码
发表于 2017-1-24 19:55:02 | 显示全部楼层
回复 1# taofan712
  1. tasklist|find /i "qq"
复制代码
除以上代码以外都可获得正确的结果,说明参与的程序和命令都没有问题。

使用以下代码经多次连续测试
  1. tasklist|find /i "csrss"
复制代码
发现屏幕显示状况有4种:
1. 看不到find输出的任何结果;
2. 看到find输出的结果一闪而过;
3. 看到find输出的结果只有后半行;
4. 看到find输出的完整结果。

使用以下筛选命令,无法获取tasklist的完整输出。
  1. tasklist|more
复制代码
使用以下筛选命令,则可以。
  1. tasklist|sort
复制代码
经分析,揣想是tasklist的特殊性(进程存在与否的信息是动态的),tasklist不止一次的操作句柄1,而cmd环境下只有一个共享的句柄1,
导致find对句柄1在内存中虽然完成操作,但还没来得及送往显存就被后续的句柄1(tasklist第二次操作句柄1)清空、或来不及清空造成的。
如果真是这样,那么给进程tasklist再加一个句柄2,让tasklist不会马上又请求句柄1,让find的句柄1有完全喘息的时间。
不知是否有点牵强附会,不过下面的代码能够解决LZ的命令中产生的不正常现象:
  1. tasklist 2>nul|find /i "qq"
复制代码
  1. tasklist 2>&1|find /i "qq"
复制代码

评分

参与人数 1技术 +1 收起 理由
taofan712 + 1 非常感谢。另外论坛搜索“句柄”无果,能多 ...

查看全部评分

发表于 2017-1-24 22:10:55 | 显示全部楼层
回复 3# CommandBatCmd


    我的Win7连续执行十几次,无法重现楼主的问题。
发表于 2017-1-24 22:15:19 | 显示全部楼层
  1. tasklist /fi "imagename eq qq.exe"
复制代码

评分

参与人数 1技术 +1 收起 理由
老刘1号 + 1 学习了

查看全部评分

发表于 2017-1-24 22:16:30 | 显示全部楼层
回复 4# GNU


    是哪个地方无法重现?
发表于 2017-1-24 22:22:43 | 显示全部楼层
回复 5# CrLf


    这样使用tasklist的内部筛选参数更可靠,值得采纳!
发表于 2017-1-24 22:43:46 | 显示全部楼层
本帖最后由 老刘1号 于 2017-1-24 22:45 编辑

回复 3# CommandBatCmd


    分析的很有道理,其实可以将信息导出后再分析
  1. (TASKLIST>%tmp%\tmpTASKLIST.tmp)&&((type "%tmp%\tmpTASKLIST.tmp"|Find /i "EXPLORER")&DEL /f "%tmp%\tmpTASKLIST.tmp")
复制代码
发表于 2017-1-24 23:00:23 | 显示全部楼层
回复 8# 老刘1号

如果没有代码洁癖,这样运行即可靠,输出又简洁!
 楼主| 发表于 2017-1-25 09:29:14 | 显示全部楼层
回复 3# CommandBatCmd
回复 2# GNU
回复 5# CrLf
回复 8# 老刘1号
非常感谢各位
CommandBatCmd的分析解答最适合我这种情况,tasklist 2>nul|find /i "qq" 确实完美的解决了显示问题。也在其他几位答案里学到新思路,再次感谢。
发表于 2017-2-6 13:55:44 | 显示全部楼层
批处理中的重定向符号以及句柄的使用方法和讲解
http://bbs.bathome.net/thread-3296-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 06:22 , Processed in 0.031662 second(s), 14 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表