Board logo

标题: [文件操作] [分享]批处理判断是文件还是文件夹的几种方法 [打印本页]

作者: namejm    时间: 2008-5-15 16:12     标题: [分享]批处理判断是文件还是文件夹的几种方法

  很多时候,我们需要对某个路径进行判断:这到底是文件的路径还是文件夹的路径?可以用以下几种方法:

  1、直接检测法:如果是文件夹,则 test 和 test\ 、test\. 、test\nul 是等同的;如果是文件,则test不等同于三者中的任何一个,利用这个原理,可以轻松地用 if exist 语句来检测。
  1. @echo off
  2. if exist test\ (echo test 是文件夹) else echo test 是文件
  3. pause
复制代码
  1. @echo off
  2. if exist test\. (echo test 是文件夹) else echo test 是文件
  3. pause
复制代码
  1. @echo off
  2. if exist test\nul (echo test 是文件夹) else echo test 是文件
  3. pause
复制代码
  2、跳转法:如果是文件夹,将能正确执行跳转命令;如果是文件,执行跳转命令时将发生错误。
  1. @echo off
  2. cd /d test && (echo test 是文件夹) else echo test 是文件
  3. pause
复制代码
  1. @echo off
  2. popd test && (echo test 是文件夹) else echo test 是文件
  3. pause
复制代码
  3、属性检测法:用 for 语句中的 %%~ai 扩展来检测文件的属性,如果是文件夹,则会显示 d 属性;如果是文件,不显示 d 属性;另外一种方法:把 dir /a-d 语句放到for语句中,通过检测for语句是否有输出来确定是文件还是文件夹。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in (test) do (
  4.     set str=%%~ai
  5.     if "!str:~0,1!"=="d" (echo %%i 是文件夹) else echo %%i 是文件
  6. )
  7. pause
复制代码
  1. @echo off
  2. set str=
  3. for /f "delims=" %%i in ('dir /a-d /b test 2^>nul') do set str=%%i
  4. if defined str (echo test 是文件) else echo test 是文件夹
  5. pause
复制代码
  是否还有其他方法,请大家讨论。

——————————————————————————————————

  随风在2楼提供了一种简洁的方法(这种方法的使用需要注意 && 和 || 的位置。还可以用 dir /a-d 的格式,请各位自行测试):
  1. @echo off
  2. dir/ad test >nul 2>nul&&echo test 是文件夹||echo test 是文件
  3. pause
复制代码


  4、创建虚拟盘法:如果是文件夹,将能创建虚拟盘符;如果是文件,将无法创建虚拟盘;( 随风 提供)
  1. @echo off
  2. subst 1: test >nul 2>nul&&(echo test 是文件夹&subst 1: /d)||echo test 是文件
  3. pause
复制代码

作者: 随风    时间: 2008-5-15 16:35

  1. @echo off
  2. dir/ad test >nul 2>nul&&echo test 是文件夹||echo test 是文件
  3. pause
复制代码

作者: namejm    时间: 2008-5-15 16:45

  呵呵,单独用 dir 来检测更简洁,我放到for语句中就显得累赘了。
作者: 随风    时间: 2008-5-15 16:54

  1. @echo off
  2. subst 1: test >nul 2>nul&&(echo test 是文件夹&subst 1: /d)||echo test 是文件
  3. pause
复制代码

作者: jvive    时间: 2008-5-17 18:20

find
findstr
也可以
作者: 梦想种子    时间: 2008-5-17 19:42

  1. @echo off
  2. (rd test 2>&1|findstr "无效")>nul&&echo 文件||echo 文件夹
  3. md test 2>nul
  4. pause
复制代码

作者: namejm    时间: 2008-5-18 20:15

  通过删除文件夹的方式来判断是文件还是文件夹,有很大的局限:如果是文件夹,必须是空的,如果文件夹不为空,就不正确了。不过还是可以作为一种思路。
作者: 路过    时间: 2012-9-22 19:35

  1. ::直接拖入文件即可
  2. @echo off
  3. title 参数鉴定  正确率:98%%
  4. set file=%*
  5. setlocal enabledelayedexpansion
  6. for %%a in (!file!) do (
  7. if "%%~nxa" equ "%%~a" (echo "%%~a"  是一个参数) else (
  8.   echo;%%~nxa0|find/i "." >nul&&set bg=1
  9.   if not exist %%~sa (
  10.    echo."%%~a"  无法读取路径
  11.   )
  12.   if not defined bg (echo."%%~a"  是标准的文件夹) else (
  13.    set bg=<nul
  14.    for /f "delims= useback" %%b in ("%%~a") do (
  15.     if not defined %%b (
  16.      set res=1
  17.     )
  18.    )
  19.    if defined res (echo."%%~a"  是普通txt样式&set res=<nul) else (
  20.     echo."%%~a"  是标准的二进制文件
  21.    )
  22.   )
  23. )
  24. )
  25. pause
复制代码

作者: CrLf    时间: 2012-9-22 19:42

  1. (echo 文件<"测试文件or文件夹"||echo 文件夹) 2>nul
复制代码

作者: changedirectory    时间: 2013-12-11 11:28

  1. @echo off
  2. set str=
  3. for /f "delims=" %%i in ('dir /a-d /b test 2^>nul') do set str=%%i
  4. if defined str (echo test 是文件) else echo test 是文件夹
  5. pause
复制代码
本人是新手,看了很多namejm的文章,都是受益匪浅。我在实验了上面的批处理时,发现好像出现错误。
  1. dir /a-d /b test
复制代码
上面的命令无论是文件还是文件夹都提示不能找到,导致判断出错。本小白做了下修改,请各路大侠指点:
  1. @echo off
  2. set str=
  3. for /f "delims=" %%i in ('dir /ad /b ^| findstr /be "test" 2^>nul') do set str=%%i
  4. if defined str (echo test 是文件夹) else echo test 是文件
  5. pause
复制代码

作者: ai20110304    时间: 2019-12-22 21:00

自带变量属性可以充分利用
  1. FORFILES /M test  /C "cmd /c if /i @isdir==true (echo test 是文件夹) else echo test是文件."
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2