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

[其他] 感悟--批处理命令call的用法

  1. @echo off
  2. set tt=woshi
  3. call :nihao tt ss
  4. echo %tt% %ss% zheli %p%
  5. goto:eof
  6. echo 33333333333333333333333333
  7. :nihao
  8. set p=%1hundan
  9. set %2=333
  10. goto:eof
复制代码
发表这个帖子,主要是感悟一下call的用法:
第1、2行不解释,第3行:call后:nihao 代表转到一段批处理,这段批处理与运行的批处理在同一个大的批处理中,关键看后边的两个参数tt ss,tt ss都没有带百分号,所以这里暂时理解为准变量,后边call转到的批处理中,如果有对这个准变量的set,将会成为真正的变量,否则将只能代表字符串“ss”“tt”。
第3行后,就运行到第7行,然后第8行:重新定义了新变量p,p被赋值为%1连接hundan这个字符串,%1即为第3行call标签后的第一个参数tt,由于tt一直未被赋值,故tt只能代表字符串“tt”,所以这里的p就被赋值为tthundan;
第9行:又是赋值,将333赋值给%2,%2就是第3行的第2个参数ss,相当于把333赋值给ss了,也就是ss就不是字符串“ss”了,而是一个变量ss,且ss被赋值为333。
第10行:goto:eof,end of file,指结束当前这段批处理,结束后再返回到第3行结尾处,即开始运行第4行。
第4行:echo了,根据上边我们的分析,call后的批处理中,tt一直未被重新赋值,所以%tt%只能是第2行的值,即woshi;%ss%为9行赋值后的333;zheli因为一直未被赋值,只能保持原样,即zheli;%p%为第8行的赋值tthundan;故输出“woshi  333  zheli  tthundan”。
第5行:又goto eof了,从整个批处理来说,分为两大段,这是主段的goto eof,会将结束整个批处理,所以第6行的echo将不再运行。
    以上代码是根据实际运行结果生拼硬套 强行解说的,如有不当、纯属正常,反正根据结果来说就得这么理解。

本帖最后由 likeyou32 于 2024-3-15 15:59 编辑
  1. @echo off
  2. set tt=woshi
  3. call :nihao %tt% ss
  4. echo %tt% %ss% zheli %p%
  5. goto:eof
  6. echo 33333333333333333333333333
  7. :nihao
  8. set p=%1hundan
  9. set %2=333
  10. goto:eof
复制代码
再来解说这段代码,这段代码与一楼的代码几乎完全一致,只是第3行call :nihao后第一个参数tt变成了%tt%,其余与一楼完全一样,只解说这点不一样的:
第8行:p=%1hundan,%1代表%tt%,%tt%就是第2行赋值的woshi,所以p就被赋值为woshihundan。其余输出与一楼一样。
总结:call :nihao后的参数,如果是百分号或感叹号引出的变量,那么前边的代码应该有赋值,可仔细往前找找;如果没有百分号或感叹号,则应是一个新变量,应该会在call转到后的批处理中进行赋值。
  1. @echo off
  2. set tt=woshi
  3. call :nihao %tt% ss
  4. echo %tt% %ss% zheli %p%
  5. goto:eof
  6. echo 33333333333333333333333333
  7. :nihao
  8. set p=%1hundan
  9. set %2=333
  10. set %1=444
  11. goto:eof
复制代码
还可以做这个测试,这里第3行参数是%tt%,第10行,将444赋值给%1的时候,你会发现根本不起作用,变量tt仍旧是第2行赋值的woshi,还可以将第10行改为set %tt%=444,你会发现仍不起作用,tt最后输出的还是woshi,只有将第10行改为set tt=444,这样才会起作用,最后echo %tt%输出444。结论,set 赋值的时候,=号左边的变量绝对不能带%%号或感叹号,即set %tt%=444是错误的,tt不会改变,只有set tt=444这样才对,tt才能被赋值。 好像也不对,应该是变量tt从未被赋值的时候,可以用set %tt%=444这样进行赋值,假如tt已经有赋值了,就必须用set tt=444进行赋值。好像又不对,我从新打开一个cmd窗口,测试set %tt%=444发现会提示命令语法不正确,,可我刚刚明明测试没问题啊,,啊,,我要发疯了,难道是变量延迟惹的祸 ?难道cmd窗口未关闭,临时变量值依旧会存在?可为什么不报错啊,邪门了!往后再进行测试,必须重新打开cmd窗口,甚至换一台电脑,nnd,明明测试的好好的,测试了好多次都没问题,,突然一转眼不经意间报错了,辛辛苦苦测试的全白费了。唉,令人着恼的cmd啊!

TOP

回复 2# likeyou32


   
试试
  1. call echo %%%tt%%%
复制代码
bat小白,请多指教!谢谢!

TOP

回复 3# 77七
  谢谢,这个我到看到过论坛里的教程,还是变量延迟惹的祸!

TOP

返回列表