复制代码
- 转载注明
- 最初见这种思想是在小楼写的文本编辑器中。当时我刚刚开始写一些运用型的批处
- 理。我当时采用的方法是新建很多文件夹累保存各个类。然后在文件夹中新建文本
- 文件存储类中的信息。这样的缺点就是临时文件太多。能不能够把所有的东西放到
- 一个文件中呢?答案是肯定的。
- 映射就是一对一的关系。你要映射,总得有个对象吧。就好像找东西。要有一个地
- 址。因此。我们的第一步应该是建立一个保存信息的变量空间。然后才是对这个的
- 引用。
- 下面是3个例子。从这3个例子中我将阐述这种思想。
- 例子一:
- 你要建立一个管理班级的档案批处理工具。档案中要包括每个同学的姓名。年龄。
- 联系方式。这个批处理工具需要支持添加学生。添加班级。修改资料等操作。你将
- 如何入手。我这里给出利用映射思想的解决方案。
- 1.)建立映射(总体是先创建一个地址。然后为地址代表一个变量。)
- 我们先确定我们配置文件的格式。这里我直接给出我的。如下:
- _班级
- 姓名:novaa;年龄:100;联系方式:hi.baidu.com/novaa
- 姓名:TheOne;年龄:99;联系方式:无
- _班级
- 姓名:novaa;年龄:100;联系方式:无
- 也就是班级以_开头。
- 跟着班级的是学生资料,格式是
- 姓名: ;年龄: ;联系方式:
- 以;做分隔符
- 好了。配置文件的格式已经确定。接下来就是建立映射关系了。我这里以读取配置
- 文件中的映射关系为例子。我先给出代码
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (Peizhi.ini) do (
- set Get=%%i&set /a Student_Number+=1
- if "!Get:~0,1!"=="_" (
- set /a Class_Number+=1
- set !Class_Number!=!Get:~1!
- set Class=!Get:~1!&set !Class!=!Get:~1!
- set Student_Number=0
- ) else (set !Class!!Student_Number!=%%i)
- )
- 位了便于大家理解,我先说一下变量代表的意义。
- Get :是从for中得到的变量
- Class_Number: 是班级的编号
- Class:是班级的名称
- !Class!:变量名是班级名称,变量所代表的还是班级名称。
- 好了。现在已经建立好了一一映射的关系。
- 我们假设配置文件中的内容为:
- _电气0604
- 姓名:novaa;年龄:100;联系方式:hi.baidu.com/novaa
- _电气0603
- 姓名:未知;年龄:未知;联系方式:未知
- 好了。我们看看经过上诉的代码一一映射后的各个变量代表的意义吧。
- 第一次循环:
- 1:电气0604 (这里1是Class_Number的数值;1所代表的变量是电气0604)
- 电气0604:电气0604(这里电气0604是Class所代表的数值。电气0604代表的是电
- 气0604)
- 之所以要
- set Class=!Get:~1!&set !Class!=!Get:~1!
- 是因为等下一次循环到下一个班级的时候,Class变量就会变换位其他的。所以要
- 先将变量的变量定义(感觉有点象指针)
- 第二次循环
- 电气06041=姓名:novaa;年龄:100;联系方式:hi.baidu.com/novaa
- (电气06041是!Class!!Student_Number!的值。)
- 下面的就重复了。这样。就建立了班级。学生。与变量的一一映射关系。
- 我们以后可以用!1!来表示电气0601了。而且1我们可以轻松的用for /l %%i in (1
- 1 10) 这样的来得到。从而可以在全局使用。(呵呵。类似全局变量)
- 例子二:
- 产生一个 000到999的随机数
- 由于是以0开头。因此循环数的嵌套不能使用。(上次小怪驴发的字典就有这个缺
- 点)
- 这个怎么解决呢?我是这样想的。我们利用1000到1999来。利用变量截取得到000
- 到999之间的数字。 然后为000到999分配地址(哈哈)。我们就可以通过地址来一
- 一映射。看看代码。
- @echo off&setlocal enabledelayedexpansion
- set weizhi=1
- for /l %%i in (1000 1 1999) do (
- set var=%%i
- set weizhi=!var:~0,1!
- set /a weizhi+=1
- )
- 这样我们就建立了000到999的存储地址了。我们可以利用!1!来引用。
- 要产生随机的000到999只需要利用random取一个1到999自建的数字。然后!数字!
- 就可以引用了。
- 例子三:
- 冒泡法排序。
- 假设有
- 1 5 65 145 236 852
- 我们先建立映射关系
- @echo off&setlocal enabledelayedexpansion
- for %%i in (1 5 65 145 236 852) do (
- set /a a+=1
- set array!a!=%%i
- )
- OK。我下面给出一个非常批处理里面的冒泡排序的例子:大家自己研究吧。
- http://bbs.verybat.cn/viewthread.php?tid=6700&highlight=%C5%C5%D0%F2
- 假设1.txt的内容如下:
- 8
- 5
- 7
- 9
- 45
- 34
- 2
- 32
- 3
- 12
- 3
- 12
- 12
- 45
- 345
- 6
- 8
- 89
- 下面的bat是对里面的数字进行排序:
- @echo off
- setlocal enabledelayedexpansion
- set a=0
- ::初始化"数组"
- for /f %%i in (1.txt) do (
- set /a a+=1
- set num!a!=%%i
- )
- ::排序
- set /a b=%a%-1
- for /l %%i in (1,1,%b%) do (
- set /a var=%%i+1
- for /l %%j in (!var!,1,%a%) do (
- call set var1=%%num%%i%%
- call set var2=%%num%%j%%
- if !var1! lss !var2! (set tmp=!var1!&set num%%i=!var2!&set num%%j=!
- tmp!)
- )
- )
- for /l %%i in (1,1,%a%) do call echo %%num%%i%%
- pause
可以看出当你选择了1-8中任一数字时,程序就会分别输出以. _ #字符与之组合后的变量的值,这就是映射。复制代码
- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,8) do set ".%%a=映射%%a-1"&set "_%%a=映射%%a-2"&set "#%%a=映射%%a-3"
- :begin
- cls&echo.
- for /l %%a in (1,1,8) do set /p=%%a <nul
- echo.&echo.&set "n="&set /p n=请选择项:
- echo.&echo 你选择的是第%n%项:!.%n%! !_%n%! !#%n%!
- pause>nul&goto begin
欢迎光临 批处理之家 (http://bbs.bathome.net/) | Powered by Discuz! 7.2 |