中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-11 00:52
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理中能否定义数组? 查看 1,460 回复 6
楼 主 批处理中能否定义数组? 发表于 2006-06-22 16:24 ·  中国 北京 联通
初级用户
积分 120
发帖 32
注册 2006-06-19 16:31
20年会员
UID 57256
状态 离线
遇到如下的一个需求:
解析文件中的每一行,希望使用变量将文件中的每一行保存起来,因为不知道文件中有多少行,所以变量个数是动态的。请问怎么解决这种问题,谢谢
2 发表于 2006-06-22 16:45 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
20年会员
UID 53056
状态 离线
好像不行吧
3 发表于 2006-06-22 22:50 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  好象CMD中变量的个数是有限制的吧?好象和内存有关系来着?

  另外,如果要把每一行保存起来,那么,你想解决什么问题呢?或许说出来之后,大家帮你想想办法,没必要用那么多的变量呢。既然提到了解析文件,那么,for语句应该派得上用场。
4 发表于 2006-06-23 13:40 ·  中国 北京 联通
初级用户
积分 120
发帖 32
注册 2006-06-19 16:31
20年会员
UID 57256
状态 离线
谢谢,是这样的一个需求:
文件中每一行记录一个软件名称,程序首先要求用户输入每个软件的安装目录,并验证用户输入的路径是否有效,全部都有效的话,才继续在用户输入的各个目录下建立一个backup的文件夹。
请注意:用户先进行软件安装路径的输入,然后进行一个完全的per-check,用户输入的路径都有效,才在用户输入的各个安装路径中进行创建backup文件夹的动作。
比如:文件中记录:
MSN
QQ

请输入MSN的安装路径: C:\program files\MSN
验证是否有效
请输入QQ的安装路径: C:\program files\QQ
验证是否有效

都有效--->在MSN 和 QQ的安装目录下创建backup文件夹。

难点在于:文件中包含的软件个数是不定的,必须遍历,而且必须记录用户输入的各个软件的安装路径。
请教各位大侠

[ Last edited by qdcr on 2006-6-23 at 13:51 ]
5 发表于 2006-06-23 16:13 ·  中国 北京 联通
初级用户
积分 120
发帖 32
注册 2006-06-19 16:31
20年会员
UID 57256
状态 离线
自己顶一下
6 发表于 2006-06-23 17:48 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
Well,qdcr可能考虑得太复杂了吧,在这个例子中其实并不需要把文件每一行的内容保存下来,只需要简单地使用for语句的文本处理方面的功能似乎就可以完成任务了:

@echo off
for /f %%i in (list.txt) do call :dosomething "%%i"
echo 开始创建目录...
for %%m in (%strAll%) do md %%m\backup
pause
goto :eof

:dosomething
set /p str=输入 %1 的目录:
if "%str%" == "" goto error
dir %str% >nul 2>nul || goto :error
set strAll=%strAll% "%str%"
goto :eof

:error
echo 目录不存在!
echo 按任意键退出...
pause>nul
exit
goto :eof

当然,在批处理中将文件每行的内容都保存下来也不是不行:

@echo off
for /f "delims=: tokens=1,2*" %%i in ('"findstr /n . list.txt"') do set %%i=%%j && set num=%%i
setlocal ENABLEDELAYEDEXPANSION
for /l %%l in (1,1,%num%) do call :dosomething "!%%l!"
echo 开始创建目录...
for %%m in (%strAll%) do md %%m\backup
pause
goto :eof

:dosomething
set /p str=输入 %1 的目录:
if "%str%" == "" goto error
dir %str% >nul 2>nul || goto :error
set strAll=%strAll% "%str%"
goto :eof

:error
echo 目录不存在!
echo 按任意键退出...
pause>nul
exit
goto :eof

在最后,还是想说的是:用批处理来处理文本内容的时候还是很麻烦的,上面的脚本并没有做更多的出错检测及处理。当文本文件的内容中包含有&,|,&&,||等特殊字符时,还是很可能引起错误的,如果你的要求比较高可以自己尝试加入一些判断并处理错误的语句。
7 发表于 2008-12-31 16:40 ·  中国 浙江 杭州 拱墅区 电信
新手上路
积分 1
发帖 1
注册 2008-12-01 15:07
17年会员
UID 132574
性别 男
状态 离线
哈哈,好东西,学习了.版主真厉害
论坛跳转: