novaa (①個亾)当前离线
学生
荣誉版主
转载注明 最初见这种思想是在小楼写的文本编辑器中。当时我刚刚开始写一些运用型的批处 理。我当时采用的方法是新建很多文件夹累保存各个类。然后在文件夹中新建文本 文件存储类中的信息。这样的缺点就是临时文件太多。能不能够把所有的东西放到 一个文件中呢?答案是肯定的。 映射就是一对一的关系。你要映射,总得有个对象吧。就好像找东西。要有一个地 址。因此。我们的第一步应该是建立一个保存信息的变量空间。然后才是对这个的 引用。 下面是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复制代码
batman 当前离线
考官
@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复制代码
TOP
tgwg001 当前离线
一级士官