endlocal 后跟 & 命令和换行的区别

Fly_m 2011-10-08 04:21:03
我有一个批处理命令,用于读取某个属性文件中指定key的值,具体的代码如下所示:

rem 读取指定文件下的指定参数的值,并将值设制到参数中
set b=-

setlocal EnableDelayedExpansion
set a=-
for /f "delims== tokens=1,2" %%i in (xxx.txt) do (
set a=%%i
call :trim a //这里的trim是一个函数,用于两边去空白

if !a!==%1 (
set b=%%j
call :trim b
break
)
)
endlocal & set b=%b%
echo %b%

我的xxx.txt文件中是这样写的:
min=256m
max=1024m
item=444

注意上面的这个endlocal & set b=%b%,它们是放到一行的,中间用 & 连接。这里调用 call xxx.bat max时,会打出 1024m,这是我所想要的。

但当把这句话换成
endlocal
set b=%b%
这样时,就打印出 - 出来,即最开始的赋值了。

如果换成
set b=%b%
endlocal
即set 在前面 endlocal在后面,也不行...

请懂的 指点一下这里的这个 & 有什么作用。一般认为这个仅指一个连接作为(即两个命令都要执行),却不知有其它作用...
...全文
283 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fly_m 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 forever_young 的回复:]

for /f %%i in ('findstr /b /i "%1=" xxxxx.txt') do (set "%%i")
[/Quote]

刚试了下,果然有用,还不晓得有findstr这个东西
Forever_Young 2011-10-09
  • 打赏
  • 举报
回复
你要求这么简单,实在没必要这么复杂,写一个你试试

readProperty.bat
[code=BatchFile]
@echo off
for /f %%i in ('findstr /b /i "%1=" xxxxx.txt') do (set "%%i")
[/code]

call readProperty min
java -Xmx%min%



Fly_m 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 forever_young 的回复:]
如果仅仅是为了输出而覆盖的话,你这个endlocal实在是有点画蛇添足的感觉,呵呵。
[/Quote]

这是因为,后面会用到这个变量,我就想在setlocal中,将里面读取出来的数据传递到外面去,然后在后面使用

比如,有一个程序,可以通过这个批处理程序读取指定key的值,然后将这个值用到当作调用命令的参数
比如
call readProperty min
命令:java -Xmx%min%
我就想这样用。
你说的setlocal的全局和局部的这个我明白,其实就是不知道关键的那个endlocal&set b=%b% 这个为什么要在同一行,才起作用。
结帐:)
Forever_Young 2011-10-09
  • 打赏
  • 举报
回复
说实话,想通过文字描述批处理的预处理和延迟环境变量扩展不容易,最起码要很好的文字功底,呵呵。

你说的优化指的是你的批处理全部内容还是就是endlocal&set b=%b%,如果是后者的话可以说没什么好优化的了,如果是你的全部代码应该是有些繁琐(从你的需求来看)。

我只能通俗的给你描述一下延迟环境变量

[code=BatchFile]
::赋值给A一个苹果,注意,这个A的苹果是全局的

set a=苹果

::这个setlocal可以理解成把全局环境变量拷贝一个本地副本

setlocal

::赋值给A一个桔子,这时候这个桔子不是全局的

set a=桔子

::这时候我们通过endlocal结束副本

endlocal

::下面的显示结果将会是全局里面的苹果,而不是桔子

echo %b%
[/code]

我不知道你批处理里拿副本的桔子覆盖全局的苹果有啥用途,如果仅仅是为了输出而覆盖的话,你这个endlocal实在是有点画蛇添足的感觉,呵呵。
mokson 2011-10-09
  • 打赏
  • 举报
回复
我对 batch 批处理应用技术掌握不全面,遗憾,惭悔。
Fly_m 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 forever_young 的回复:]

批处理是一句一句的来处理,加了&就是一句,所以处理endlocal&set b=%b%和分开两行处理结果是不一样的,这一句也是预处理机制起了作用,所以效果看起来就很有趣了。
[/Quote]
能不能解释一下,为什么endlocal&set b=%b%这个,写成
endlocal
set b=%b%
或者
set b=%b%
endlocal
这样都不行。有没有能够把上面的代码,优化一下的方法?
Forever_Young 2011-10-08
  • 打赏
  • 举报
回复
批处理是一句一句的来处理,加了&就是一句,所以处理endlocal&set b=%b%和分开两行处理结果是不一样的,这一句也是预处理机制起了作用,所以效果看起来就很有趣了。
Fly_m 2011-10-08
  • 打赏
  • 举报
回复
顶上去...

6,850

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧