中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 被一个 Wimc 低级 BUG 郁闷N天 上一主题 | 下一主题
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『楼 主』:  被一个 Wimc 低级 BUG 郁闷N天


@echo off
set keyname=微软真垃圾
set /p=%keyname%<nul>name.txt
wmic /?
pause
BUG症状光标闪烁批处理被中断,环境WinXP SP2,我原来的批处理代码很长,挖出这个臭虫用了N天,本以为代码某部分不稳定,原来被这个低级臭虫整了,真郁闷~
大家以后注意 set /p= <nul>name.txt和wmic在同一批处理中使用

   此帖被 +2 点积分     点击查看详情   
评分人:【 vkill 分数: +2  时间:2008-1-22 13:51




第一高手    第二高手

2008-1-20 19:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 2 楼』:  

你工作目录下应新生成了一个批处理吧?

2008-1-21 01:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 3 楼』:  

set /p=%keyname%<nul>name.txt
跟上copy con file与more也是这种情况,不过wmic会将输入当成一个脚本

2008-1-21 01:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 4 楼』:  

当前目录没生成批处理。
本来只是用set/p生成一个不带换行符的文本,没想到此后wmic任何参数不起作用了。



第一高手    第二高手

2008-1-21 12:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 5 楼』:  

解决方法
@echo off
set keyname=微软真垃圾
set /p=%keyname%<nul>name.txt
set /p=<nul>nul
wmic /?
pause




第一高手    第二高手

2008-1-21 12:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 6 楼』:  

看来问题还是出在set/p参数方面
@echo off
set keyname=微软真垃圾
>name.txt set/p=%keyname%<nul
wmic /?
pause




第一高手    第二高手

2008-1-21 13:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by fastslz at 2008-1-21 12:47 PM:
当前目录没生成批处理。
本来只是用set/p生成一个不带换行符的文本,没想到此后wmic任何参数不起作用了。

不是不启作用了,而是几次重定向后不知为何激活了wmic打控制台获取输入
你可以在命令行下输入然后以ctrl+z终止就会产生一个wmic的临时性脚本文件

只要有打控制台接收数据功能的命令都会在这样的批处理下产生这样的错误
按你的批处理我觉得有这种功能的命令都有一个潜在的句柄,这个句柄是命令自定义的,主要来完成管道传输

2008-1-22 13:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 8 楼』:  

这样也可以啊
@echo off
set keyname=微软真垃圾
>name.txt set /p=%keyname%<nul
wmic /?
pause
所以我写>file时都把>写在前面

2008-1-22 13:50
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 9 楼』:  

楼主的精神值得鼓励

2008-1-22 13:51
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 10 楼』:  



  Quote:
我在一个批处理中使用下面代码获取磁盘空间
wmic logicaldisk get DeviceID,FreeSpace,Size | findstr "%_Drives%"

但是发现程序某些时刻运行时会失去响应
此时在当前命令行下直接运行以下代码也会失去响应
wmic logicaldisk get DeviceID,FreeSpace,Size

在输入一个Ctrl+Z和一个回车后会继续输出执行结果
此时会在当前路径下产生一个零字节的文件
TempWmicBatchFile.bat

此时另开一个命令行环境
当前路径相同
执行此代码无问题

与此相关的问题也出现使用脚本操作diskpart列磁盘分区时
此时只能Ctrl+Break终止代码执行

怀疑是这些命令在执行时会锁定一些卷
而如果在这些命令上使用管道
而命令的管道管道需要在%TMP%产生临时文件
而如果%TMP%所在卷恰被锁定
则临时文件无法建立在这个卷上建立
管道操作就无法完成
管道后的命令输入被转向控制台
而输入Ctrl+Z加回车后正是结束控制台输入

当然目前为止这只是猜测……

这是我在另一篇主题帖的发言
是在没有看此主题之前

现在综合两个主题的讨论
我觉得很像是自定义句柄的问题
也即是说wmic很可能使用了3-9中的某个自定义句柄
而此时如果使用set /p,copy con或者管道操作时
会有很大概率将这个自定义句柄“污染”
导致wmic的输入被转向控制台
而且这样的“污染”是在一个命令行会话中全局有效的

与此相关的讨论见
http://www.cn-dos.net/forum/viewthread.php?tid=16942

[ Last edited by qzwqzw on 2008-1-24 at 08:36 PM ]

2008-1-24 20:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 11 楼』:  

everest79也说了会产生一个临时文件的,而我这里没发现临时文件,看来是另一种“句柄污染”wmic对管道符特别敏感



第一高手    第二高手

2008-1-24 20:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 12 楼』:  

这样就可以继续
@echo off
set keyname=微软真垃圾
set /p=%keyname%<nul>name.txt
START  wmic /?



简单!简单!再简单!
2008-1-24 21:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 13 楼』:  


@echo off
s<nul>nul
echo test
wmic /?
pause
这样的代码说明问题与set /p无关
而是与代码中出现的两个重定向符号<和>有关
这与http://www.cn-dos.net/forum/viewthread.php?tid=16942中的讨论就对应的上了
12楼的start是新开了命令行会话
问题自然可以解决
但通常意义不大
因为我们很难把wmic的输出传回至原命令行会话

[ Last edited by qzwqzw on 2008-1-24 at 09:16 PM ]

2008-1-24 21:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 14 楼』:  

从6楼可以看出
@echo off
>nul s<nul
echo test
wmic /?
pause
这样重定向就不会出现这样的情况



第一高手    第二高手

2008-1-24 21:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 15 楼』:  

具体的原因肯定与WMIC内部的处理机制有关
从那个TempWmicBatchFile.bat可以看出其中的端倪

不过无论如何
我们不能因为wmic而不使用<nul>nul的句式
所以使用下面的方法应该在批处理中有效的
wmic /?<nul
或者
cd.|wmic /?
这样不用管脚本前面使用了那些自定义句柄
都保证wmic所用的都是一致的

但是在命令行下运行cd.|wmic /?提示
Win32 错误: 另一个程序正在使用此文件,进程无法访问。
很有意思的提示!

2008-1-24 22:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: