Board logo

标题: [其他] 【求助】批处理中set /p不支持管道|输入内容? [打印本页]

作者: defanive    时间: 2009-3-1 00:06     标题: 【求助】批处理中set /p不支持管道|输入内容?

“|”连接符,就是把上个命令的执行结果(标准输出)作为下个命令的操作输入(标准输入)来执行。。。



例子很多啦:

echo y|format H:

format命令格式化之前需要询问,echo y就代替了输入y

echo XXXX|findstr .

findstr可以处理标准输入



还有一个众所周知的例子:

set /p a=<a.txt

将a.txt中第一行的内容保存到a变量中

<是把句柄作为标准输入到命令中执行,所以第一行的内容就被输入了进去,换行的时候等于按了回车,就有了这个结果



好像下面这个就不太行了:

type a.txt|set /p a=

变量a没有被赋值

连最基本的

echo 123|set /p a=

都不行

我总感觉代码没错,为什么捏哦。。。
作者: defanive    时间: 2009-3-7 01:04

顶起,这贴都沉了不知多久了,真的没人知道么。。。
作者: batman    时间: 2009-3-7 01:49

我认为set /p是不接收管道的,不但如此连直接写在后面的值都不会被赋值给变量,只会将其值显示出来,如下:
  1. @echo off
  2. set "a=123"
  3. set /p b=%a%
  4. echo %b%&pause>nul
复制代码

作者: defanive    时间: 2009-3-7 11:39

set /p a=<a.txt
这就说明了set /p接收管道啊!
作者: Batcher    时间: 2009-3-7 11:42     标题: 回复 4楼 的帖子

有什么证据来证明<a.txt是通过管道实现的吗?
愿闻其详。
作者: zqz0012005    时间: 2009-3-7 11:53

不支持也没什么奇怪的。runas也不支持呢(也可能是不理会)
作者: Batcher    时间: 2009-3-7 12:40     标题: 回复 6楼 的帖子

用echo命令通过管道向runas命令发送密码的方法是不行的,因为runas绕过了IO控制台直接从键盘获取密码字符串,所以echo到控制台的密码被忽略,而代以空密码进行用户验证。runas的这个机制也许正是为了避免在命令行使用密码进行其他用户权限的程序调用,因为不这样做有可能为命令行实现的暴力破解程序留下可趁之机,并且避免了密码的暴露,但同时也降低了授权用户合法访问的便捷性。

作者: zqz0012005    时间: 2009-3-7 13:37

很多通过管道应答,很多命令的结果会不一样。再比如label:

C:\Documents and Settings\Administrator\桌面>label C:
驱动器 C: 中的卷是 winxp
卷序列号为 1815-C3D2
卷标(如果没有,请按 ENTER)?

是否删除当前的卷标(Y/N)?(一直回车)

是否删除当前的卷标(Y/N)?

是否删除当前的卷标(Y/N)?

是否删除当前的卷标(Y/N)? ^C
C:\Documents and Settings\Administrator\桌面>echo.|label C:
驱动器 C: 中的卷是 winxp
卷序列号为 1815-C3D2
卷标(如果没有,请按 ENTER)?
是否删除当前的卷标(Y/N)?
是否删除当前的卷标(Y/N)?
C:\Documents and Settings\Administrator\桌面>vol C:
驱动器 C 中的卷是 winxp
卷的序列号是 1815-C3D2

如果输入不符合要求,命令会一直让你输入。管道应答不正确的话,命令会自动中断。
作者: defanive    时间: 2009-3-7 14:33

<是将文件内容作为输入,|是将上个命令的输出作为输入,都是通过输入的方式传递给set /p的,没理由<支持而|不支持。。。
作者: Batcher    时间: 2009-3-7 14:39

程序员写了那个功能模块就是支持,没写就是不支持。不需要理由吧?
同样的命令在XP上正常,在2k上就出错,我们不能说它没有理由的啊。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2