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

[原创] 批处理代码解读 变量截取、变量延迟及特殊符号

[复制链接]
发表于 2009-8-11 03:06:21 | 显示全部楼层 |阅读模式
变量截取、变量延迟及特殊符号的一个高级综合应用实例
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,谢谢他的提醒!

评分

参与人数 2PB +8 收起 理由
Seter + 3 看不懂..幸苦了..
batman + 5 感谢分享

查看全部评分

发表于 2009-8-12 14:47:09 | 显示全部楼层
水平有限,看得头都痛!!无奈!
发表于 2009-8-20 10:20:54 | 显示全部楼层
我承认我的头很疼 用特殊符号来赋值 看着就晕.....还用call来脱百分号 更晕了....呼呼
我要耐心 再看一遍..
发表于 2009-10-4 18:57:24 | 显示全部楼层
好好学习,天天向上!!!!!!!!!!1
发表于 2009-11-27 18:54:10 | 显示全部楼层
内容t+ttttttttttttttttt
发表于 2012-6-3 11:44:17 | 显示全部楼层
那么多人 不懂啊 那我真的个更不懂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 05:10 , Processed in 0.018178 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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