标题: [文本处理] [讨论]对批处理中set /p命令结合管道或重定向赋值时的几点猜测 [打印本页]
作者: HAT 时间: 2011-10-22 00:00 标题: [讨论]对批处理中set /p命令结合管道或重定向赋值时的几点猜测
- @echo off
- set var1=
- set var2=
- rem 第一个set /p尝试从子进程的输入流里面读取1203个字符,取第一个\n之前的字符串赋值给var1
- rem 但是总共传进来的字符串太少了,所以没有什么可以留给第二个set /p了(并非子进程过早关闭神马的)
- findstr "123" %0 | cmd /v /c "set /p var1=&set var1&set /p var2=&set var2"
- rem 123456
- pause
复制代码
- @echo off
- set var3=
- set var4=
- rem 只有当传递给子进程的字符串足够第一个set /p吃饱的时候,第二个set /p才有机会取到值
- findstr "abc" %0 | cmd /v /c "set /p var3=&set var3&set /p var4=&set var4"
- rem abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij
- pause
复制代码
- @echo off
- set var5=
- set var6=
- findstr "xyz" %0 >a.txt
- rem 使用重定向的时候,文本内容是传递给整个语句块的
- rem 那个for+set /p合并文件的例子也许更加容易理解http://bbs.bathome.net/thread-13327-1-1.html
- rem 重定向不是传递给for命令本身,而是传递给整个for语句块
- rem 有Shell基础的朋友可以体会一下这个帖子http://bbs.chinaunix.net/thread-3606286-1-1.html
- (set /p var5=&set var5&set /p var6=&set var6)<a.txt
- rem uvwxyz
- pause
复制代码
作者: CrLf 时间: 2011-10-22 11:02
本帖最后由 CrLf 于 2011-10-22 11:03 编辑
为了简化表述,以如变量 %command% 指代管道之前的命令,格式如下:- %command%|cmd /c "set /p #1=&set /p #2=&set #"
- >1.txt %command%&cmd<1.txt /c "set /p $1=&set /p $2=&set $"
- pause
复制代码
当 %command% 为 "findstr . %0" 或者 "more %0" 时,管道的结果中 #2 为空,重定向则结果正常
%command% 等于 "cmd /c dir" 或 "tasklist /fo csv" 时,管道的结果中 #2 被赋值,但是规则很怪异,看不懂,重定向的结果则很正常。
我就纳了闷了...
作者: garyng 时间: 2011-10-23 15:47
我....看不懂
窗口闪了下而已~
作者: wc726842270 时间: 2011-10-23 23:12
最近有点上火,也没太认真看,不过看来有2点
1,\n\r(回车换行,0A,0D)
2,1023
但是说实话,这的脚本的字符个数没查,静待丰收了,呵呵
PS:这个应该也算是“溢出”吧,
作者: HAT 时间: 2011-10-25 00:50
回复 2# CrLf
第二段不是说了吗,变量2能否被赋值取决于通过管道传进来的输入流是否足够长。
重复运行几次会发现变量2的值有时会飘忽不定,那是因为缓冲区在上次执行的时候没有被及时清理。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |