找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 66384|回复: 10

[文件操作] [分享]批处理判断是文件还是文件夹的几种方法

[复制链接]
发表于 2008-5-15 16:12:18 | 显示全部楼层 |阅读模式
  很多时候,我们需要对某个路径进行判断:这到底是文件的路径还是文件夹的路径?可以用以下几种方法:

  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:26 | 显示全部楼层
  1. @echo off
  2. dir/ad test >nul 2>nul&&echo test 是文件夹||echo test 是文件
  3. pause
复制代码
 楼主| 发表于 2008-5-15 16:45:03 | 显示全部楼层
  呵呵,单独用 dir 来检测更简洁,我放到for语句中就显得累赘了。
发表于 2008-5-15 16:54:49 | 显示全部楼层
  1. @echo off
  2. subst 1: test >nul 2>nul&&(echo test 是文件夹&subst 1: /d)||echo test 是文件
  3. pause
复制代码
发表于 2008-5-17 18:20:36 | 显示全部楼层
find
findstr
也可以
发表于 2008-5-17 19:42:46 | 显示全部楼层
  1. @echo off
  2. (rd test 2>&1|findstr "无效")>nul&&echo 文件||echo 文件夹
  3. md test 2>nul
  4. pause
复制代码
 楼主| 发表于 2008-5-18 20:15:55 | 显示全部楼层
  通过删除文件夹的方式来判断是文件还是文件夹,有很大的局限:如果是文件夹,必须是空的,如果文件夹不为空,就不正确了。不过还是可以作为一种思路。
发表于 2012-9-22 19:35:10 | 显示全部楼层
  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
复制代码
发表于 2012-9-22 19:42:25 | 显示全部楼层
  1. (echo 文件<"测试文件or文件夹"||echo 文件夹) 2>nul
复制代码
发表于 2013-12-11 11:28:45 | 显示全部楼层

  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
复制代码
发表于 2019-12-22 21:00:54 | 显示全部楼层
自带变量属性可以充分利用
  1. FORFILES /M test  /C "cmd /c if /i @isdir==true (echo test 是文件夹) else echo test是文件."
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:10 , Processed in 0.030156 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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