Board logo

标题: [文本处理] [讨论]对批处理中set /p命令结合管道或重定向赋值时的几点猜测 [打印本页]

作者: HAT    时间: 2011-10-22 00:00     标题: [讨论]对批处理中set /p命令结合管道或重定向赋值时的几点猜测

  1. @echo off
  2. set var1=
  3. set var2=
  4. rem 第一个set /p尝试从子进程的输入流里面读取1203个字符,取第一个\n之前的字符串赋值给var1
  5. rem 但是总共传进来的字符串太少了,所以没有什么可以留给第二个set /p了(并非子进程过早关闭神马的)
  6. findstr "123" %0 | cmd /v /c "set /p var1=&set var1&set /p var2=&set var2"
  7. rem 123456
  8. pause
复制代码
  1. @echo off
  2. set var3=
  3. set var4=
  4. rem 只有当传递给子进程的字符串足够第一个set /p吃饱的时候,第二个set /p才有机会取到值
  5. findstr "abc" %0 | cmd /v /c "set /p var3=&set var3&set /p var4=&set var4"
  6. rem abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij
  7. pause
复制代码
  1. @echo off
  2. set var5=
  3. set var6=
  4. findstr "xyz" %0 >a.txt
  5. rem 使用重定向的时候,文本内容是传递给整个语句块的
  6. rem 那个for+set /p合并文件的例子也许更加容易理解http://bbs.bathome.net/thread-13327-1-1.html
  7. rem 重定向不是传递给for命令本身,而是传递给整个for语句块
  8. rem 有Shell基础的朋友可以体会一下这个帖子http://bbs.chinaunix.net/thread-3606286-1-1.html
  9. (set /p var5=&set var5&set /p var6=&set var6)<a.txt
  10. rem uvwxyz
  11. pause
复制代码

作者: CrLf    时间: 2011-10-22 11:02

本帖最后由 CrLf 于 2011-10-22 11:03 编辑

为了简化表述,以如变量 %command% 指代管道之前的命令,格式如下:
  1. %command%|cmd /c "set /p #1=&set /p #2=&set #"
  2. >1.txt %command%&cmd<1.txt /c "set /p $1=&set /p $2=&set $"
  3. 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://www.bathome.net/) Powered by Discuz! 7.2