Board logo

标题: 被一个 Wimc 低级 BUG 郁闷N天 [打印本页]

作者: fastslz     时间: 2008-1-20 19:06    标题: 被一个 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在同一批处理中使用

作者: everest79     时间: 2008-1-21 01:20
你工作目录下应新生成了一个批处理吧?

作者: everest79     时间: 2008-1-21 01:25
set /p=%keyname%<nul>name.txt 跟上copy con file与more也是这种情况,不过wmic会将输入当成一个脚本

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

作者: fastslz     时间: 2008-1-21 12:58
解决方法
@echo off
set keyname=微软真垃圾
set /p=%keyname%<nul>name.txt
set /p=<nul>nul
wmic /?
pause

作者: fastslz     时间: 2008-1-21 13:52
看来问题还是出在set/p参数方面
@echo off
set keyname=微软真垃圾
>name.txt set/p=%keyname%<nul
wmic /?
pause

作者: everest79     时间: 2008-1-22 13:28
Originally posted by fastslz at 2008-1-21 12:47 PM: 当前目录没生成批处理。 本来只是用set/p生成一个不带换行符的文本,没想到此后wmic任何参数不起作用了。
不是不启作用了,而是几次重定向后不知为何激活了wmic打控制台获取输入 你可以在命令行下输入然后以ctrl+z终止就会产生一个wmic的临时性脚本文件 只要有打控制台接收数据功能的命令都会在这样的批处理下产生这样的错误 按你的批处理我觉得有这种功能的命令都有一个潜在的句柄,这个句柄是命令自定义的,主要来完成管道传输

作者: vkill     时间: 2008-1-22 13:50
这样也可以啊
@echo off
set keyname=微软真垃圾
>name.txt set /p=%keyname%<nul
wmic /?
pause
所以我写>file时都把>写在前面

作者: vkill     时间: 2008-1-22 13:51
楼主的精神值得鼓励

作者: qzwqzw     时间: 2008-1-24 20:34
我在一个批处理中使用下面代码获取磁盘空间 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的输入被转向控制台 而且这样的“污染”是在一个命令行会话中全局有效的 与此相关的讨论见 www.cn-dos.net/forum ... [ Last edited by qzwqzw on 2008-1-24 at 08:36 PM ]

作者: fastslz     时间: 2008-1-24 20:40
everest79也说了会产生一个临时文件的,而我这里没发现临时文件,看来是另一种“句柄污染”wmic对管道符特别敏感

作者: terse     时间: 2008-1-24 21:02
这样就可以继续 @echo off set keyname=微软真垃圾 set /p=%keyname%<nul>name.txt START wmic /?

作者: qzwqzw     时间: 2008-1-24 21:12
@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 ]

作者: fastslz     时间: 2008-1-24 21:29
从6楼可以看出 @echo off >nul s<nul echo test wmic /? pause 这样重定向就不会出现这样的情况

作者: qzwqzw     时间: 2008-1-24 22:36
具体的原因肯定与WMIC内部的处理机制有关 从那个TempWmicBatchFile.bat可以看出其中的端倪 不过无论如何 我们不能因为wmic而不使用<nul>nul的句式 所以使用下面的方法应该在批处理中有效的 wmic /?<nul 或者 cd.|wmic /? 这样不用管脚本前面使用了那些自定义句柄 都保证wmic所用的都是一致的 但是在命令行下运行cd.|wmic /?提示 Win32 错误: 另一个程序正在使用此文件,进程无法访问。 很有意思的提示!

作者: fastslz     时间: 2008-1-24 23:22
确实是它的特别处理机制 /OUTPUT 为输出重新定向指定模式。 /APPEND 为输出重新定向指定模式。 /AGGREGATE 设置或重置集合模式。 /AUTHORITY Specifies the <authority type> for the connection. 帮助里/AUTHORITY 后面的英文到底怎么理解?

作者: qzwqzw     时间: 2008-1-25 00:01
指定连接的授权类型 有NTLM、Kerberos等

作者: zsc37201     时间: 2010-6-30 18:03    标题: 我的也是,我为这个问题用了半天时间
::@echo off
:nf
for /f %%i in ('wmic datafile "d:\\test.txt" get filesize') do echo %%i 
more <b.txt >123.txt
goto :nf
和楼主一样的问题,不知道是什么原因。