dos批处理下自动给环境变量赋值的问题

set /p a= <a.txt(此语句自动将a.txt文件里的字符串赋值给变量a,此方法可行)

echo abcd|set /p a=(用数据通道将字符串abcd传给变量a,此方法不可行,为什么)

还有其他自动给环境变量赋值的方法吗,请帮帮我,谢谢

我的回答仅供参考,不嫌水平低和罗嗦的话,我空间有篇关于变量的文章也可以去看看。
1 用户定义的变量称之为环境变量不妥, 因为所设置的变量仅是在当前CMD窗口下有效,也并非定义某种环境
2 应该说CMD提供给变量赋值仅一个命令,那就是set
3 set 命令给变量赋值有三种基本形式,不加参数的和加 /p 及/a 其中,set/p 除了能接收键盘输入值外,还提供了你所说的形式,把一个文件的第一行赋给变量, 而set/a 兼计算功能,将结果(数字型)赋给变量,且可一条命令(不用连接命令)给多个变量赋值
4 按道理说用管道命令是可以代替用户输入的,正如你所说的实际上对set/p 不行,我只能这么猜测, 命令无非是设计出来的程序,一般命令如遇运行过程中需要接收键盘输入,设计者都考虑了可以接收管道传入值代替,而这个set/p却并没有考虑它,以前DOS的set命令并没有/p功能,也许当初在"改造"它时疏忽,后来又觉得没必要再去修改。总之实际不行是硬道理, 没必要去追究为什么
5 我想很多人会有这种看法,要是可以把某命令的结果有个命令直接赋给变量就好了,遗憾的是没有,好在有个for命令,经扩展功能后,确实“强大”得很,其中加/f 的可以把命令结果、文件内容或多行的字符串,逐行按需要截取后直接进行处理或再利用set命令赋给某变量备用,提到它并不是说多了一种赋值方法,而是很多时候是在这个命令里(还是利用set)赋值的追问

请举个例子如何用for /f语句再利用set自动给变量赋值(写一个命令让我看看)

谢谢

追答

这种例子太多了,为了说明把命令值赋给变量,给几个命令你在命令行测试:
显示网络信息
ipconfig/all
从中截取 mac地址所在行
ipconfig/all|find "Physical"
用for命令仅显示mac地址
for /f "tokens=2 delims=:" %i in ('ipconfig/all^|find "Physical"')do @echo %i
这里是直接显示,比如要赋给一变量,把上行的echo %i改为set mac=%i
不过,如果有几个mac地址,将最终赋为最后一个mac地址,当然要想有几个就保存几个也是可以的,你需要具备更多的处理能力,
补充提示: for命令里的%i 如写到批处理中得双写%符,有兴趣的话,我空间还可以看for的文章,但是有关变量的处理,以及综合能力也很重要

追问

for语句能不能嵌套呢
为什么管道符“|”前要加“^”呢
谢谢

追答

for可以嵌套
^是转义符,代表之后的一个特殊字符在进行处理时作为普通字符, 什么时候及为什么要加它,涉及命令解析处理过程

追问

我在cmd内输入:at 14:17 /interactive cmd /k dir c:\^|find "DIR"
用at察看,待执行的命令行是:at 14:17 /interactive cmd /k dir c:\|find DIR
没有了双引号,执行时显示“find格式不正确”,

怎样才能在计划任务中 正确使用find指令

谢谢

追答

呵呵,你这干的活是我都没弄过的,动动脑子,既然是少了引号你再多加一层引号嘛
嗯试了一下,它还是把引号去了,那你就把find换成findstr,它可以不要引号

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-13
@echo off

setlocal enabledelayedexpansion
set classpath=.;d:\app\WEB-INF\classes
for %%c in ("d:\app\WEB-INF\lib\*.jar") do set classpath=!classpath!;%%c
echo %classpath%
set classpath=%classpath%;d:\app\WEB-INF\classes
echo %classpath%
java com.test.Test >>d:\app\logs\test%date:~,4%%date:~5,2%%date:~8,2%.log

编辑成.BAT文件就可以了追问

请问这个是dos批处理文件吗,怎么java都出来了

第2个回答  2011-08-12
echo abcd|set /p a=

这样有点多次一举,下面这句能实现你的想法
set a=abcd
相似回答