Board logo

标题: [原创] 批处理代码解读 变量截取、变量延迟及特殊符号 [打印本页]

作者: 小勇12    时间: 2009-8-11 03:06     标题: 批处理代码解读 变量截取、变量延迟及特殊符号

变量截取、变量延迟及特殊符号的一个高级综合应用实例
http://www.bathome.net/thread-2286-1-8.html
高手略过
  1. @color 0a&set,=0123456&set/=青天有月来几时 我今停杯一问之 人攀明月不可得 月行却与人相随
  2. @for /l,%%a,in,(1,1,28)do,@set/a?=1/(6/\)2>nul||(set\=0&echo\&echo\&call,call,set/=%%%%/:~%%]%%%%%%&set]=8)&call,call,call,set/p= %%%%%%%%/:~%%%%,:~%%\%%,1%%%%,1%%%%%%%%<nul&set/a\+=1&ping/n 2 127.1>nul
复制代码
改写成如下:
  1. @echo off
  2. color 0a
  3. set,=0123456
  4. set/=青天有月来几时 我今停杯一问之 人攀明月不可得 月行却与人相随
  5. for /l %%a in (1 1 28) do set/a ?=1/(6/\) 2>nul||(
  6. set \=0
  7. echo\&echo\
  8. call,call,set/=%%%%/:~%%]%%%%%%
  9. rem call echo %%/%%
  10. rem call echo %%]%%
  11. set]=8
  12. )&call,call,call,set/p= %%%%%%%%/:~%%%%,:~%%\%%,1%%%%,1%%%%%%%<nul&set/a\+=1&ping/n2 127.1>nul
复制代码
解释分析:
表达式 set/a ?=1/(6/\) 当\变量不为空时, 这个set /a 才成立。这个表达式中“/”都表示除法
  1. @echo off
  2. set /a ?=1/(1/p)
  3. set /a f=1*p
  4. echo %f%
  5. pause>nul
复制代码
当表达中使用未定义变量,其默认值为0。(算术表达式语句中)

因为第一次循环set/a ?=1/(6/\)的“\”未定义,所以默认值为0。但是0不能作为除数。所以会发生错误。

因此会执行(set \=0 echo\&echo\ call,call,set/=%%%%/:~%%]%%%%%% call echo %%/%% set]=8 )
并且执行call,call,call,set/p= %%%%%%%%/:~%%%%,:~%%\%%,1%%%%,1%%%%%%%%<nul&set/a \+=1&ping/n 2 127.1>nul
第一次循环后,“\”的值已经不再为0。所以第二次循环set/a ?=1/(6/\) 不会报错,就会跳过执行
(set \=0 echo\&echo\ call,call,set/=%%%%/:~%%]%%%%%% call echo %%/%% set]=8 )
直接执行call,call,call,set/p= %%%%%%%%/:~%%%%,:~%%\%%,1%%%%,1%%%%%%%%<nul&set/a \+=1&ping/n 2 127.1>nul ,当“\”为7时1/(6/7)中的(6/7)=0,又会导致报错。以后分析同上


call echo %%]%% 第一次进入(。。。)时变量]没有定义就是使用,所以值为空。
call,call,set/=%%%%/:~%%]%%%%%% 相当于没有截取。 “/”=青天有月来几时 我今停杯一问之 人攀明月不可得 月行却与人相随

call echo %%]%% 第二次进入(。。。)时变量]为8
“/”=我今停杯一问之 人攀明月不可得 月行却与人相随

call,call,call,set/p= %%%%%%%%/:~%%%%,:~%%\%%,1%%%%,1%%%%%%%%<nul
内层 %%%%,:~%%\%%,1%%%% 从字符串0123456中截取第%\%位
外层 同理

连接两个命令,当||前的命令失败时,才执行||后的命令。
连接两个命令,当&&前的命令成功时,才执行&&后的命令。

此bat将||与&&用得非常妙!并且对call 进行变量延迟用到了至极。
call,call,call,set/p= %%%%%%%%/:~%%%%,:~%%\%%,1%%%%,1%%%%%%%%<nul
此语句用的相当漂亮。应该称为变量截取嵌套,最终实现输出。


首先在此感谢batman,谢谢他的提醒!
作者: januapr    时间: 2009-8-12 14:47

水平有限,看得头都痛!!无奈!
作者: 基拉freedom    时间: 2009-8-20 10:20

我承认我的头很疼 用特殊符号来赋值 看着就晕.....还用call来脱百分号 更晕了....呼呼
我要耐心 再看一遍..
作者: wychun    时间: 2009-10-4 18:57

好好学习,天天向上!!!!!!!!!!1
作者: GUGEWANG    时间: 2009-11-27 18:54

内容t+ttttttttttttttttt
作者: jackmux    时间: 2012-6-3 11:44

那么多人 不懂啊 那我真的个更不懂了




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2