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