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

[文本处理] [已解决]求解释:批处理中的 call set 语句

[复制链接]
发表于 2013-5-19 15:05:34 | 显示全部楼层 |阅读模式
本帖最后由 garyv 于 2013-5-22 08:59 编辑

call set var2=%%!var1!:~0,1%%

为什么这条set语句可以被call?是什么含义,会进入什么地方定义的function呢?

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-5-19 16:29:33 | 显示全部楼层
call...???set被call???你去看看变量延迟吧....
  1. @echo off
  2. set a=10&&@echo a=%a%
  3. @echo a=%a%
  4. set b=20&&call echo b=%%b%%
复制代码
看看结果??懂了没??
发表于 2013-5-19 16:33:16 | 显示全部楼层
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set d=100&&echo d=%d%
  4. set c=100&&echo c=!c!
复制代码
这个和call的效果一样.....开启setlocal EnableDelayedExpansion
.
 楼主| 发表于 2013-5-19 23:11:53 | 显示全部楼层
回复 3# 林小七


    看了几个关于 setlocal enabledelayedexpansion 的链接,但是都没有讲解"call set xxx"例子,还是不明白 call set。。。

这位高手能否提供一个合适的链接或文档?
发表于 2013-5-19 23:29:31 | 显示全部楼层
发表于 2013-5-20 16:14:49 | 显示全部楼层
回复 4# garyv


    楼上给了哦...如果你系统的看bathome的教程会有这个 的..不要心急哦
 楼主| 发表于 2013-5-20 23:51:01 | 显示全部楼层
回复 6# 林小七


    你的例子我是看明白了,但是下面从网上找到的大小写转换的代码没弄明白:
  1. echo off
  2. setlocal enabledelayedexpansion

  3. set str=aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ
  4. for %%i in (%str%) do set "var=%%i" & set !var:~0,1!=%%i

  5. set "TS="
  6. set /P TS=请输入测试字符:
  7. for /l %%i in (0 1 100) do (
  8.         set "T3=!TS:~%%i,1!"
  9.         if "!T3!"=="" goto :Res
  10.         if defined !T3! (
  11.                 call set T2=%%!T3!:~0,1%%
  12.                 if "!T3!"=="!T2!" call set T2=%%!T3!:~1,1%%) else set "T2=!T3!"
  13.         set Res=!Res!!T2!
  14. )
  15. :Res
  16. echo.&echo 转换前:!TS!
  17. echo 转换后:!Res!
复制代码
疑问:
1)如果没有"setlocal enabledelayedexpansion"语句下面的set...和for...那2行,运行结果是不对的,有这2行就是正确的!
2)这2行语句中"!var:~0,1!=%%i",不知什么含义,难道是:取出var中的第一个字符然后被%%i赋值?一个常量怎么被赋值呢?
 楼主| 发表于 2013-5-21 09:00:07 | 显示全部楼层
请高手帮我看看
发表于 2013-5-21 09:07:48 | 显示全部楼层
回复 7# garyv


难道是:取出var中的第一个字符然后被%%i赋值?一个常量怎么被赋值呢?

它就是一个普通的字母而已,为什么说它是常量呢?
发表于 2013-5-21 09:31:57 | 显示全部楼层
回复 7# garyv


如果没有"setlocal enabledelayedexpansion"语句下面的set...和for...那2行,运行结果是不对的,有这2行就是正确的!

就是变量延迟的两种不同方法而已
  1. @echo off
  2. REM Method 1
  3. set str=aA
  4. for %%i in (%str%) do (
  5.     set "var=%%i"
  6.     call set %%var:~0,1%%=%%i
  7.     call echo %%a%%
  8. )

  9. REM Method 2
  10. setlocal enabledelayedexpansion
  11. set str=aA
  12. for %%i in (%str%) do (
  13.     set "var=%%i"
  14.     set !var:~0,1!=%%i
  15.     echo !a!
  16. )
复制代码
 楼主| 发表于 2013-5-21 09:32:08 | 显示全部楼层
回复 9# Python


    从C的角度分析,左边取出的字符没有显式地保存到一个变量中,这种左值是不能被赋值的,难道是替换?
发表于 2013-5-21 09:41:24 | 显示全部楼层
回复 11# garyv


    这是BAT,不能从C的角度去分析。
 楼主| 发表于 2013-5-21 10:10:09 | 显示全部楼层
回复 10# Python


    这2种方法打印出来都是 aA,没有进行大小写转换,还有那条echo后面的变量%a%是从哪里来的呢?

顺便解释一下我贴上去的大小写转换代码,谢谢。
发表于 2013-5-21 17:08:57 | 显示全部楼层
回复 13# garyv


10楼的代码是给你演示两种不同的变量延迟扩展,不是为了大小写转换。
你希望解释代码里面的哪个部分?
发表于 2013-5-21 17:22:09 | 显示全部楼层
请问具体哪里不明白呢???
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 06:16 , Processed in 0.024458 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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