中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [在线求助]变量未定义的问题
« [1] [2] »
作者:
标题: [在线求助]变量未定义的问题 上一主题 | 下一主题
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『楼 主』:  [在线求助]变量未定义的问题

我想在CheckV.TXT中查找ACCESS字符串,如果找到就赋值给变量ACCESS,如果找不到则把值NO赋给变量,但是运用后这时则使用ECHO %ACCESS% 不能显示出改变量,说明变量NO没有赋给ACCESS,不知道是那里的错误,请求高手指点下.
我的代码如下:

@ECHO OFF
   FOR /F %%I IN ('FINDSTR /I "ACCESS" "%TEMP%"\CheckV.TXT') DO (
   SET ACCESS=%%I
   IF /I NOT DEFINED I (SET ACCESS=NO)
   )
   ECHO %ACCESS%
PAUSE

其中CheckV.TXT的内容如下,这个文件的内容我是从一个网页文件中提取的(ACCESS运行的条件:主程序ACCESS,DAO ADO和JET及其版本):
Jet4.0
DAO3.60
ADO2.80
ACCESS2003

[ Last edited by HUNRYBECKY on 2006-12-19 at 02:08 AM ]

2006-12-18 22:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 2 楼』:  


@ECHO OFF
   FOR /F %%I IN ('FINDSTR /I "ACCESS" %TEMP%\CheckV.TXT') DO (
   SET ACCESS=%%I
   IF /I NOT DEFINED ACCESS (SET ACCESS=NO)
   )
   ECHO %ACCESS%
PAUSE
是否要定义的为ACCESS?



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-12-18 23:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 3 楼』:  

好像有问题,存在ACCESS时没事,若找不到ACCESS就不行了。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-12-18 23:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 4 楼』:  

是呀,所以怎么解决这个问题呢.我怎么试验也不行.

2006-12-18 23:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by ccwan at 2006-12-18 23:27:
好像有问题,存在ACCESS时没事,若找不到ACCESS就不行了。

如果找到ACCESS行我就赋找到的值给ACCESS变量,否则赋变量NO给ACCESS变量.

2006-12-18 23:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 6 楼』:  

当那个 Findstr 找不到 ACCESS 字符串时,那个 for 是取不出来结果的(空),
既然for取到的是0行内容,那么for中的语句不会被执行。

所以,for一想:“怎么一行内容都没有读到啊?喔……干脆我甭执行了,退出吧……”。
于是for以外(后面)的 Echo 就显示了一个未定义的变量:)


[怎么知道for里面的语句没有执行?]

可以在那个For里面单独加一句: Echo  没执行
然后运行代码,如果Findstr找不到 “ACCESS” 字符串,上面这句是显示不出来的,就说明它没有执行。

(for /f 取不取内容再执行for里面的语句显然没有实际用处)

[ Last edited by redtek on 2006-12-18 at 10:45 AM ]

   此帖被 +2 点积分      点击查看详情   
评分人:【 HUNRYBECKY 分数: +2  时间:2006-12-18 23:58




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-18 23:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 7 楼』:  

这样没问题了
@ECHO OFF
FOR /F "DELIMS=" %%I IN ('FINDSTR /I "ACCESS" %TEMP%\CheckV.TXT') DO (
IF NOT "%%I"=="" SET ACCESS=%%I&GOTO LOOK )
ECHO NO&PAUSE
GOTO :EOF
:LOOK
ECHO %ACCESS%
PAUSE


   此帖被 +7 点积分      点击查看详情   
评分人:【 redtek 分数: +5  时间:2006-12-18 23:49
评分人:【 HUNRYBECKY 分数: +2  时间:2006-12-18 23:59




三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-12-18 23:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 8 楼』:  

find /i "access" && set access=access || set access=no
不知道能不能满足楼主的要求。

PS:“但是运用后这时则使用ECHO %ACCESS% 不能显示出改变量” 这是什么语法?

2006-12-18 23:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by redtek at 2006-12-18 23:44:
当那个 Findstr 找不到 ACCESS 字符串时,那个 for 是取不出来结果的(空),
既然for取到的是0行内容,那么for中的语句不会被执行。

扠...

分析的非常有道理.现在明白了,原来我钻进死牛角了,怎么也找不到这个

2006-12-19 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by NaturalJ0 at 2006-12-18 23:52:
find /i "access" && set access=access || set access=no
不知道能不能满足楼主的要求。

PS:“但是运用后这时则使用ECHO %ACCESS% 不能显示出改变量†...

find在文件查找后回返回文件的路径和找到的字符串,所以使用FIND无法实现的,但是可以使用FINDSTR解决这个问题;
access=access这个也是不行的.实际上我是查找包含ACCESS行的变量,如找到ACCESS97则ACCESS=ACCESS97,找到ACCESS2007则ACCESS=ACCESS2003,我的目的很明确就是为了检测ACCESS的版本问题;
ECHO %ACCESS% 如果没有改ACCESS变量则显示不错,而显示回显关闭什么的.

2006-12-19 00:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by ccwan at 2006-12-18 23:47:
这样没问题了
[code]@ECHO OFF
FOR /F "DELIMS=" %%I IN ('FINDSTR /I "ACCESS" %TEMP%\CheckV.TXT') DO (
IF NOT "%%I"=="" SET ACCESS=%%I&GOTO LOOK )
...

我的问题不是当没有的时候就不显示而是必须把值赋给ACCESS,即ACCESS=NO

2006-12-19 00:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 12 楼』:  


@ECHO OFF
FOR /F %%I IN ('FINDSTR /I "ACCESS" %TEMP%\CheckV.TXT') DO (
IF NOT "%%I"=="" SET ACCESS=%%I&GOTO LOOK )
SET ACCESS=NO
ECHO %ACCESS%&PAUSE
GOTO :EOF
:LOOK
ECHO %ACCESS%
PAUSE




三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-12-19 00:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 13 楼』:  

问题已经解决,根据REDTEK兄弟的提示,修改为以下代码就OK了:
@ECHO OFF
FOR /F "DELIMS=" %%I IN ('FINDSTR /I "ACCESS" %TEMP%\CheckV.TXT') DO (
IF NOT "%%I"=="" SET ACCESS=%%I)
IF NOT DEFINED ACCESS SET ACCESS=NO
ECHO %ACCESS%
PAUSE

这里不能使用IF NOT DEFINED I SET ACCESS=NO 因为正如REDTEK兄弟所说的,变量I实际上是在FOR语句中,而DEFINED则是在FOR之外,所以开始用I不行,改为FOR就可以了

另外大家想想能否直接使用FINDSTR实现,关键点在于如何把FINDSTR返回的值赋给一个变量ACCESS.

2006-12-19 00:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by ccwan at 2006-12-19 00:25:
[code]@ECHO OFF
FOR /F %%I IN ('FINDSTR /I "ACCESS" %TEMP%\CheckV.TXT') DO (
IF NOT "%%I"=="" SET ACCESS=%%I&GOTO LOOK )
SET ACCESS=NO
ECHO %ACCESS%&PAUSE
...

谢谢兄弟,代码测试OK

2006-12-19 00:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 15 楼』:  

另一种方法:
@echo off && set "access=NO"
for /f %%i in ('findstr /i "ACCESS" "%temp%\CheckV.txt"') do set access=%%i
echo %access%

pause
先赋值给 access=NO
然后再执行for读出那个你要的数据。假如就算 Findstr 没找到 "ACCESS" 也没关系,顶多 for 中 access 变量没被赋值。

但是,for之前已经被赋初值NO了,所以后面 FOR 不成功就是NO,如果成功找到了那么ACCESS=NO的原值会被FOR中的值取代~:)



(多谢版主提醒,我也忘记加引号了,刚刚补上~:)

[ Last edited by redtek on 2006-12-18 at 01:09 PM ]

   此帖被 +5 点积分       点击查看详情   
评分人:【 ccwan 分数: +5  时间:2006-12-19 02:06




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-19 01:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: