[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [讨论]对批处理中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
复制代码

回复 2# CrLf


第二段不是说了吗,变量2能否被赋值取决于通过管道传进来的输入流是否足够长。
重复运行几次会发现变量2的值有时会飘忽不定,那是因为缓冲区在上次执行的时候没有被及时清理。

TOP

最近有点上火,也没太认真看,不过看来有2点
1,\n\r(回车换行,0A,0D)
2,1023
但是说实话,这的脚本的字符个数没查,静待丰收了,呵呵
PS:这个应该也算是“溢出”吧,
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

我....看不懂
窗口闪了下而已~

TOP

本帖最后由 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 被赋值,但是规则很怪异,看不懂,重定向的结果则很正常。
我就纳了闷了...

TOP

返回列表