标题: 请教批处理:如何确认指定文件在硬盘上是否存在?
[打印本页]
作者: lianjiang2004
时间: 2006-10-29 09:06
标题: 请教批处理:如何确认指定文件在硬盘上是否存在?
请教批处理:如何确认指定文件在硬盘上是否存在?
我想实现下面的任务,如何写批处理? 就是从C盘开始到O为止,检查根目录下是否存在aaa.txt这个文件,存在的话,就输出盘符给以变量,并执行其他任务,否则继续查找直到O盘结束。
作者: namejm
时间: 2006-10-29 09:31
@echo off
for %%i in (c d e f g h i j k l m n o) do if exist %%i:\aaa.txt goto another
goto :eof
:another
command
作者: yangzhiyi
时间: 2006-10-29 09:34
IF EXIST c:\aaa.txt set 变量=c:
IF EXIST d:\aaa.txt set 变量=d:
...
IF EXIST o:\aaa.txt set 变量=o:
其它任务
够直接吧,或
IF EXIST c:\aaa.txt set 变量=c: & goto end
IF EXIST o:\aaa.txt set 变量=o: & goto end
:end
其它任务
还是楼上的利害,我一直都不会用 for ,有人能发一个for 的详细说明吗
[
Last edited by yangzhiyi on 2006-10-29 at 09:36 AM ]
作者: lianjiang2004
时间: 2006-10-29 09:38
谢谢版主,请问goto :eof 什么意思?另外我还需要知道这个文件在哪个盘,需要把%%i传给一个变量,好对这个文件进行操作。
为这个功能借了DOS书,上网也查了半天,还没会。
作者: lianjiang2004
时间: 2006-10-29 09:40
[quote]Originally posted by
yangzhiyi at 2006-10-29 09:34:
IF EXIST c:\aaa.txt set 变量=c:
IF EXIST d:\aaa.txt set 变量=d:
...
IF EXIST o:\aaa.txt set 变量=o:
------------------
这样我也想到了,就是太麻烦。呵呵。谢谢了。
作者: lianjiang2004
时间: 2006-10-29 09:46
这样不行吧?一句里命令太多。
for %%q in (c d e f g h i j k l) do set abc=%%q if exit %abc%:\aaa.txt goto ok1
作者: namejm
时间: 2006-10-29 09:48
一般而言,goto :eof 的功能相当于exit,但是,如果用 call 来调用某个标签段的话,这个标签段中必须包含一个 goto :eof 而不能用 exit 来替换。
如果想知道这个文件在哪个盘上的话,把2F的代码稍微多写一点就可以了:
@echo off
for %%i in (c d e f g h i j k l m n o) do (
if exist %%i:\aaa.txt set drive=%%i&goto another
)
goto :eof
:another
echo aaa.txt位于 %drive% 分区
command
作者: lianjiang2004
时间: 2006-10-29 09:58
多谢了,明白了,用括号括起来的用法。
作者: lianjiang2004
时间: 2006-10-29 11:01
怎么回事?运行出错,哪里我哪里写错了吗?
---------
1.bat
rem @echo off
REM 判断_c.bat位置
for %%i in (c d e f) do (if exist %%i:\_c.bat set drv_c=%%i goto ok1)
_cn.bat
goto :eof
:ok1
rem 找到文件所在盘符。
--------------------------------------------------
运行后显示
D:\>(if exist c:\_c.bat set drv_c=c goto ok1)
Bad command or file name
作者: lianjiang2004
时间: 2006-10-29 11:04
这样也不行。
rem @echo off
REM 判断_c.bat位置
for %%i in (c d e f) do (
if exist %%i:\_c.bat set drv_c=%%i goto ok1
)
_cn.bat
goto :eof
:ok1
rem 找到文件所在盘符。
作者: namejm
时间: 2006-10-29 11:10
set drv_c=%%i 和 goto ok1 之间还有一个连接符
&
作者: lianjiang2004
时间: 2006-10-29 20:57
版主,下面两种都还是不行呀。是不是拷贝出来字符变掉了?实在不好意思,能不能以附件形式给我?
-----------
rem @echo off
for %%i in (c d e) do (if exist %%i:\aaa.txt set drive=%%i&goto another)
goto :eof
:another
echo aaa.txt位于 %drive%
--------------
rem @echo off
for %%i in (c d e) do (
if exist %%i:\aaa.txt set drive=%%i&goto another
)
goto :eof
:another
echo aaa.txt位于 %drive%
作者: namejm
时间: 2006-10-30 00:25
观察你修改后的代码,最后没有暂停语句pause,怀疑是因为找到了之后却不暂停就直接退出了,导致你误认为代码出错。
我已经把代码用[code]和[/code]括起来了,你点7F的 [Copy to clipboard] 就可以把代码分毫不差地复制下来,最后一个command你用pause来替换就可以了。在我的机子上测试通过,不知道你机子上是否存在一个根目录下的aaa.txt,请你再检查一次。
[[i] Last edited by namejm on 2006-10-30 at 01:03 AM [/i]]
作者: lianjiang2004
时间: 2006-10-30 01:27
我再看看。我在测试时都把第一句前加了rem,在goto: eof上句加了pause。
-------------
还是不行。为缩小循环,改成查找c-e。虚拟机截图如下:
[
Last edited by lianjiang2004 on 2006-10-30 at 02:16 AM ]
附件
1: snap.jpg (2006-10-30 02:16, 21.32 K, 下载附件所需积分 1点
,下载次数: 3)
附件
2: snap1.jpg (2006-10-30 02:16, 22.8 K, 下载附件所需积分 1点
,下载次数: 3)
附件
3: snap2.jpg (2006-10-30 02:16, 21.16 K, 下载附件所需积分 1点
,下载次数: 3)
作者: lxmxn
时间: 2006-10-30 04:18
楼上的是用虚拟机测试的?
是不是用的DOS系统测试的啊?DOS里面的批处理好象不支持"("和")"的使用,建议改成"goto [标签]"的形式...
作者: lianjiang2004
时间: 2006-10-30 06:52
虚拟机测试的,实机会不一样?这就用实DOS看看。
报告测试结果,实机与虚拟机结果完全一样。用虚拟机主要是截图方便。
[
Last edited by lianjiang2004 on 2006-10-30 at 07:05 AM ]
作者: lxmxn
时间: 2006-10-30 07:15
不是要你测试什么虚拟机或者是DOS实模式,是DOS系统不支持" ( "和" ) "还有" & "等符号的执行,所以要用 if 和 goto 等语句变通..
作者: lianjiang2004
时间: 2006-10-30 07:29
本人对DOS只知道点皮毛,平时一般都是修改别人的autoexec.bat等,能否给看看我的问题,DOS下用该如何写?
不好意思,开始没把问题说清楚。
[
Last edited by lianjiang2004 on 2006-10-30 at 07:33 AM ]
作者: fastslz
时间: 2006-10-30 07:45
先说明运行环境很重要~~
作者: mountvol
时间: 2006-10-30 07:57
for %%i in (o n m l k j i h g f e d c) do if exist %%i:\aaa.txt set drive=%%i
作者: lianjiang2004
时间: 2006-10-30 07:58
DOS启动盘里用的。谢谢。
作者: hhl
时间: 2006-10-30 08:05
namejm斑竹,你上面写的代码,有点疑惑,似乎只能找到第一个含有aaa.txt的分区,不知对不对。
作者: fastslz
时间: 2006-10-30 08:08
@echo off
for %%a in (c d e f g h i j k l m n o) do if exist %%a:\aaa.txt set 输出盘符变量=%%a
for %%b in (c d e f g h i j k l m n o) do if "%输出盘符变量%"=="%%b" echo aaa.txt位于 %%b:
作者: lianjiang2004
时间: 2006-10-30 09:04
Quote: |
Originally posted by fastslz at 2006-10-30 08:08:
@echo off
for %%a in (c d e f g h i j k l m n o) do if exist %%a:\aaa.txt set 输出盘符变量=%%a
for %%b in (c d e f g h i j k l m n o) do if "%输出盘符变量%"=="%%b" ... |
|
请教:
for %%a这句已经把aaa.txt存在的盘符给了变量,那for %%b这句的作用是什么?不要行吗?
作者: fastslz
时间: 2006-10-30 09:23
晕晕~的全部不要都行^_^
第2句for是满足你(存在的话,就输出盘符给以变量,并执行其他任务,否则继续查找直到O盘结束。)的要求,你可以将echo aaa.txt位于 %%b:改成goto %%b: 或edit %%b:\aaa.txt
作者: lianjiang2004
时间: 2006-10-30 10:08
谢谢,好像明白了一些。
感谢各位的热情解答!!!
作者: namejm
时间: 2006-10-30 11:20
Quote: |
Originally posted by hhl at 2006-10-30 08:05:
namejm斑竹,你上面写的代码,有点疑惑,似乎只能找到第一个含有aaa.txt的分区,不知对不对。 |
|
完全正确,因为楼主说只要找到了就显示并执行其他的动作,所以就写成那样了。如果要找到含有aaa.txt的所有分区其实也不难。