找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32054|回复: 5

[系统相关] 如何实现把命令的结果直接存入/赋值给变量

[复制链接]
发表于 2017-2-19 19:41:35 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2017-2-27 02:37 编辑

如题,比如要把一条命令存入变量的话,通常我会这样做:
  1. dir /b *.doc > mem.txt
  2. set /p f= < mem.txt
  3. del mem.txt
  4. echo %f%
复制代码
这里是要把 dir /b *.doc 这条命令的结果存入 f 这个变量,但要用到中间文件。
有什么办法能够不通过中间文件做到呢,也不要用for /f。

很奇怪如下的命令为何无效?
  1. dir /b *.doc | set /p f=
复制代码
发表于 2017-2-20 09:30:19 | 显示全部楼层
一般都是用 for /f 命令
发表于 2017-2-20 14:55:27 | 显示全部楼层
回复 1# liero1982
  1. dir /b *.doc > mem.txt
  2. set /p f= < mem.txt
  3. del mem.txt
  4. echo %f%
复制代码
这个用法不能得到men.txt的全部内容吧,%f%好像只能得到men.txt里的第一行内容。
我在这个帖子学到过http://www.bathome.net/thread-13327-1-1.html
 楼主| 发表于 2017-2-26 05:41:30 | 显示全部楼层
回复 3# taofan712
谢谢这篇文章对我很有帮助。
发表于 2017-2-26 08:09:40 | 显示全部楼层
本帖最后由 老刘1号 于 2017-2-26 08:20 编辑

回复 4# liero1982

转自    http://tieba.baidu.com/p/3535724353 中华同志的普及教程


一般情况下,需要等待用户输入的外部命令才可以用管道来传递输入,
为什么是外部命令?


因为在CMD中,管道符号实际上是启动了一个新的CMD来执行后面的命令,然后将前一个进程的输出当作后一个进程的输入
如果是Echo bat吧万岁|Set /P Str=
那么cmd就会启动一个新的进程,但它是这样的
C:\windows\system32\cmd.exe /S /D /C "Set /P Str="


Str被赋值了吗?当然!
我们可以改成这样
Echo bat吧万岁|(Set /P Str=&Set Str)


就可以很明显地看到,Str的确被赋值了


但是为什么命令执行完后我Set Str还是显示未定义?
仔细看一看,Str的值在哪个CMD里?
了解了这一点,管道就变得非常简单了


还需要注意的是,管道不能传递标准错误输出流
@Echo Off
Md $Test\$Test
Rd $Test|Findstr “目录不是空的”
Echo %Errorlevel%
Pause
Echo Y|Rd /S $Test



由于$Test里面还有个目录,所以单用Rd删除时会提示"目录不是空的",
我们用管道将这个信息传递给Findstr,返回值显示为1,代表前面的Findstr执行失败了,
因为"目录不是空的"属于标准错误输出,无法用管道传递.

评分

参与人数 1技术 +1 收起 理由
liero1982 + 1 +1

查看全部评分

发表于 2017-2-26 09:33:39 | 显示全部楼层
还需要注意的是,管道不能传递标准错误输出流

如果有需要的话,可以把stderr重定向到stdout然后再通过管道传递。
  1. rd a 2>&1 | findstr "空"
复制代码

评分

参与人数 1技术 +1 收起 理由
老刘1号 + 1

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 15:22 , Processed in 0.017354 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表