标题: [系统相关] 如何实现把命令的结果直接存入/赋值给变量 [打印本页]
作者: liero1982 时间: 2017-2-19 19:41 标题: 如何实现把命令的结果直接存入/赋值给变量
本帖最后由 pcl_test 于 2017-2-27 02:37 编辑
如题,比如要把一条命令存入变量的话,通常我会这样做:- dir /b *.doc > mem.txt
- set /p f= < mem.txt
- del mem.txt
- echo %f%
复制代码
这里是要把 dir /b *.doc 这条命令的结果存入 f 这个变量,但要用到中间文件。
有什么办法能够不通过中间文件做到呢,也不要用for /f。
很奇怪如下的命令为何无效?复制代码
作者: GNU 时间: 2017-2-20 09:30
一般都是用 for /f 命令
作者: taofan712 时间: 2017-2-20 14:55
回复 1# liero1982 - dir /b *.doc > mem.txt
- set /p f= < mem.txt
- del mem.txt
- echo %f%
复制代码
这个用法不能得到men.txt的全部内容吧,%f%好像只能得到men.txt里的第一行内容。
我在这个帖子学到过http://www.bathome.net/thread-13327-1-1.html
作者: liero1982 时间: 2017-2-26 05:41
回复 3# taofan712
谢谢这篇文章对我很有帮助。
作者: 老刘1号 时间: 2017-2-26 08:09
本帖最后由 老刘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执行失败了,
因为"目录不是空的"属于标准错误输出,无法用管道传递.
作者: GNU 时间: 2017-2-26 09:33
如果有需要的话,可以把stderr重定向到stdout然后再通过管道传递。复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |