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

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

本帖最后由 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=
复制代码

一般都是用 for /f 命令

TOP

回复 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

TOP

回复 3# taofan712
谢谢这篇文章对我很有帮助。

TOP

本帖最后由 老刘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

评分人数

TOP

还需要注意的是,管道不能传递标准错误输出流

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

评分人数

TOP

返回列表