无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4353|回复: 12
打印 上一主题 下一主题

windows CMD与DOS 7.1 for语句if语句的差异? [8F]

[复制链接]
跳转到指定楼层
1#
发表于 2011-9-17 08:21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题描述:在各分区根目录或根目录下的mydir下查找123.exe这个文件,若找到第一个就报告“找到了”并不再继续搜索。

现存在“d:\mydiy\123.exe”,用下面的代码在windows 命令行模式下可以正常运行,并找到文件,而在dos 7.1下(事先已加载NTFS文件读写支持)总是找不到,不知该如何修改?

  1. @echo off
  2. set srcfile=empty
  3. set myfile=123.exe
  4. set _goto=333

  5. for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%b:\%myfile% (
  6. set srcfile=%%b:\%myfile%
  7. goto %_goto%
  8. ) else (
  9. if exist %%b:\mydir\%myfile% (
  10. set srcfile=%%b:\mydir\%myfile%
  11. goto %_goto%
  12. )
  13. )
  14. echo  "没找到"
  15. goto end

  16. :333
  17. echo 找到了 %srcfile%~~~~

  18. :end
  19. pause
复制代码

[ 本帖最后由 chiannet 于 2011-9-18 09:17 编辑 ]
2#
发表于 2011-9-17 11:05:36 | 只看该作者
DOS下FOR循环不支持复杂的嵌套。

以下代码未测试,不知行不行。

@echo off
set srcfile=empty
set myfile=123.exe
set _goto=333
set driver=

for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%a:\%myfile% set driver=%%a
for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%b:\%myfile% goto 111
for %%c in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%c:\mydir\%myfile% set driver=%%c
for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%d:\mydir\%myfile% goto 222
if "%driver%"=="" echo 没找到
goto end

:111
set srcfile=%driver%:\%myfile%
goto %_goto%

:222
set srcfile=%driver%:\mydir\%myfile%
:333
echo 找到了 %srcfile%~~~~

:end
pause

[ 本帖最后由 2011pzn 于 2011-9-17 11:34 编辑 ]
回复

使用道具 举报

3#
发表于 2011-9-17 12:07:58 | 只看该作者
测试运行正常
回复

使用道具 举报

4#
 楼主| 发表于 2011-9-17 14:12:07 | 只看该作者
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%a:\%myfile% set driver=%%a
这句存在缺陷,假定存在c:\123.exe和d:\123.exe,当找到c:\123.exe时,未跳出for循环,将会set driver=d,
我现在的意思是想实现:只要找到第一个123.exe就跳出FOR循环, set driver=c。




下面的代码经在DOS7.1测试,只能找到可能存在的最靠后的一个盘符上的123.exe,但也不能定位第一个。


  1. @echo off
  2. set srcfile=empty
  3. set myfile=123.exe
  4. set _goto=333

  5. for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%b:\%myfile% set srcfile=%%b:\%myfile%
  6. if not "%srcfile%"=="empty" goto %_goto%
  7. for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%b:\mydir\%myfile% set srcfile=%%b:\mydir\%myfile%
  8. if not "%srcfile%"=="empty" goto %_goto%

  9. echo  "没找到"
  10. goto end
  11. :333
  12. echo 找到了 %srcfile%~~~~
  13. :end
  14. pause
复制代码

[ 本帖最后由 chiannet 于 2011-9-17 14:19 编辑 ]
回复

使用道具 举报

5#
发表于 2011-9-17 17:54:03 | 只看该作者
原帖由 chiannet 于 2011-9-17 14:12 发表
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%a:\%myfile% set driver=%%a
这句存在缺陷,假定存在c:\123.exe和d:\123.exe,当找到c:\123.exe时,未跳出for循环,将会set dri ...


这个有点难度

[ 本帖最后由 2011_sim 于 2011-9-17 19:10 编辑 ]
回复

使用道具 举报

6#
发表于 2011-9-18 00:47:12 | 只看该作者

回复 #4 chiannet 的帖子

有一笨办法能实现,前题是你所说的特定的文件:“各分区根目录或根目录下的mydir下查找123.exe”必须确保其中一个条件为真,
不然下面的办法会出现死循环。这办法能解决for语句中像你所说的出现的问题。
以两个批处理文件进行参数传递:假设aa.bat,bb.bat,用的时候只需执行aa.bat即可。
aa.bat:
@echo off
call bb.bat c: d: e: f: g: h: i: j: k: l: m: n: o: p: q: r: s: t: u: v: w: x: y: z:

bb.bat:
set myfile=123.exe
:loop
if exist %1\%myfile% goto flag
if exist %1\mydir\%myfile% goto flag1
shift
goto loop
:flag
set drive=%1
echo 目标文件是:%drive%\%myfile%
goto end
:flag1
set drive=%1
echo 目标文件是:%drive%\mydir\%myfile%
goto end
rem 下面注释掉的语句是解决死循环的跳转标号,明天再想办法解决,如果按上面说的确保其中一个条件为真的话,不会出现死循环。
rem :error
rem echo 找不到特定的文件
:end
pause

+++++++++++++
当两条件为假出现死循环的问题已解决,代码我已贴至10楼。

[ 本帖最后由 2011_sim 于 2011-9-18 13:57 编辑 ]
回复

使用道具 举报

7#
 楼主| 发表于 2011-9-18 09:07:32 | 只看该作者

回复 #7 2011_sim 的帖子

aa.bat:
  1. @echo off
  2. set myfile=123.exe
  3. call bb.bat c d e f g h i j k l m n o p q r s t u v w x y z ZZ
复制代码
bb.bat
  1. @echo off
  2. :loop
  3. set d=%1:
  4. if "%d%" == "ZZ:" goto error
  5. if exist %d%\%myfile% goto flag
  6. if exist %d%\mydir\%myfile% goto flag1
  7. shift
  8. goto loop
  9. :flag
  10. echo 目标文件是:%d%\%myfile%
  11. goto end
  12. :flag1
  13. echo 目标文件是:%d%\mydir\%myfile%
  14. goto end
  15. :error
  16. echo 找不到特定的文件
  17. :end
  18. pause
复制代码





2011_sim 你真牛!3QU

[ 本帖最后由 chiannet 于 2011-9-18 09:16 编辑 ]
回复

使用道具 举报

8#
发表于 2011-9-18 10:42:18 | 只看该作者
原帖由 chiannet 于 2011-9-17 14:12 发表
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%a:\%myfile% set driver=%%a
这句存在缺陷,假定存在c:\123.exe和d:\123.exe,当找到c:\123.exe时,未跳出for循环,将会set dri ...


如果中途跳出FOR循环,DOS下由FOR定义的%%a变量会失效,不好办哦。

如果C大只是想定位到第一个找到的文件(但需中途不跳出循环),结合strings可以办到。

@echo off
set srcfile=empty
set myfile=123.exe
set _goto=333

del tmp*.txt >nul
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%a:\%myfile% echo %%a:\%myfile% >>tmp1.txt
strings fs1=filesize tmp1.txt
if "%fs1%"=="0" goto next
strings srcfile=read tmp1.txt,1
goto %_goto%

:next
for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%b:\mydir\%myfile% echo %%b:\mydir\%myfile% >>tmp2.txt
strings fs2=filesize tmp2.txt
if "%fs2%"=="0" goto nofile
strings srcfile=read tmp2.txt,1
goto %_goto%

:nofile
cls
echo.
echo  "没找到"
goto end

:333
cls
echo.
echo 找到了 %srcfile%~~~~

:end
pause
回复

使用道具 举报

9#
发表于 2011-9-18 11:38:26 | 只看该作者

回复 #8 chiannet 的帖子

这是修正过的解决了假如全盘(包括光驱)两个条件都为假的代码(死循环bug得到解决):
aa.bat原内容不变
bb.bat:
@echo off
set myfile=123.exe
:loop
if %1==z: goto error
if exist %1\%myfile% goto flag
if exist %1\mydir\%myfile% goto flag1
shift
goto loop
:flag
set drive=%1
echo 目标文件是:%drive%\%myfile%
goto end
:flag1
set drive=%1
echo 目标文件是:%drive%\mydir\%myfile%
goto end
:error
if exist %1\%myfile% goto flag
if exist %1\mydir\%myfile% goto flag1
echo 找不到特定的文件
:end
pause

[ 本帖最后由 2011_sim 于 2011-9-18 11:44 编辑 ]
回复

使用道具 举报

10#
 楼主| 发表于 2011-9-18 12:01:51 | 只看该作者

回复 #9 2011pzn 的帖子

不错,又一个解决之道!!
回复

使用道具 举报

11#
发表于 2011-9-18 13:31:28 | 只看该作者
原帖由 chiannet 于 2011-9-18 12:01 发表
不错,又一个解决之道!!

请教C大,下面的空行有什么作用呢??

回复

使用道具 举报

12#
 楼主| 发表于 2011-9-18 19:39:41 | 只看该作者

回复 #12 2010527104427 的帖子

每次由DD写到 autoexec.bat的行就写到这个区域
回复

使用道具 举报

13#
发表于 2011-9-18 20:09:45 | 只看该作者
原帖由 chiannet 于 2011-9-18 19:39 发表
每次由DD写到 autoexec.bat的行就写到这个区域

哈哈``难怪了,我用DD命令调用原版的MAXDOS9就遇到一些问题,原来是这个原因,哈哈,谢C大不吝赐教,感谢感谢!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-17 00:42

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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