标题: [文件操作] [分享]批处理判断是文件还是文件夹的几种方法 [打印本页]
作者: namejm 时间: 2008-5-15 16:12 标题: [分享]批处理判断是文件还是文件夹的几种方法
很多时候,我们需要对某个路径进行判断:这到底是文件的路径还是文件夹的路径?可以用以下几种方法:
1、直接检测法:如果是文件夹,则 test 和 test\ 、test\. 、test\nul 是等同的;如果是文件,则test不等同于三者中的任何一个,利用这个原理,可以轻松地用 if exist 语句来检测。- @echo off
- if exist test\ (echo test 是文件夹) else echo test 是文件
- pause
复制代码
- @echo off
- if exist test\. (echo test 是文件夹) else echo test 是文件
- pause
复制代码
- @echo off
- if exist test\nul (echo test 是文件夹) else echo test 是文件
- pause
复制代码
2、跳转法:如果是文件夹,将能正确执行跳转命令;如果是文件,执行跳转命令时将发生错误。- @echo off
- cd /d test && (echo test 是文件夹) else echo test 是文件
- pause
复制代码
- @echo off
- popd test && (echo test 是文件夹) else echo test 是文件
- pause
复制代码
3、属性检测法:用 for 语句中的 %%~ai 扩展来检测文件的属性,如果是文件夹,则会显示 d 属性;如果是文件,不显示 d 属性;另外一种方法:把 dir /a-d 语句放到for语句中,通过检测for语句是否有输出来确定是文件还是文件夹。- @echo off
- setlocal enabledelayedexpansion
- for %%i in (test) do (
- set str=%%~ai
- if "!str:~0,1!"=="d" (echo %%i 是文件夹) else echo %%i 是文件
- )
- pause
复制代码
- @echo off
- set str=
- for /f "delims=" %%i in ('dir /a-d /b test 2^>nul') do set str=%%i
- if defined str (echo test 是文件) else echo test 是文件夹
- pause
复制代码
是否还有其他方法,请大家讨论。
——————————————————————————————————
随风在2楼提供了一种简洁的方法(这种方法的使用需要注意 && 和 || 的位置。还可以用 dir /a-d 的格式,请各位自行测试):- @echo off
- dir/ad test >nul 2>nul&&echo test 是文件夹||echo test 是文件
- pause
复制代码
4、创建虚拟盘法:如果是文件夹,将能创建虚拟盘符;如果是文件,将无法创建虚拟盘;( 随风 提供)
- @echo off
- subst 1: test >nul 2>nul&&(echo test 是文件夹&subst 1: /d)||echo test 是文件
- pause
复制代码
作者: 随风 时间: 2008-5-15 16:35
- @echo off
- dir/ad test >nul 2>nul&&echo test 是文件夹||echo test 是文件
- pause
复制代码
作者: namejm 时间: 2008-5-15 16:45
呵呵,单独用 dir 来检测更简洁,我放到for语句中就显得累赘了。
作者: 随风 时间: 2008-5-15 16:54
- @echo off
- subst 1: test >nul 2>nul&&(echo test 是文件夹&subst 1: /d)||echo test 是文件
- pause
复制代码
作者: jvive 时间: 2008-5-17 18:20
find
findstr
也可以
作者: 梦想种子 时间: 2008-5-17 19:42
- @echo off
- (rd test 2>&1|findstr "无效")>nul&&echo 文件||echo 文件夹
- md test 2>nul
- pause
复制代码
作者: namejm 时间: 2008-5-18 20:15
通过删除文件夹的方式来判断是文件还是文件夹,有很大的局限:如果是文件夹,必须是空的,如果文件夹不为空,就不正确了。不过还是可以作为一种思路。
作者: 路过 时间: 2012-9-22 19:35
- ::直接拖入文件即可
-
- @echo off
- title 参数鉴定 正确率:98%%
- set file=%*
- setlocal enabledelayedexpansion
- for %%a in (!file!) do (
- if "%%~nxa" equ "%%~a" (echo "%%~a" 是一个参数) else (
- echo;%%~nxa0|find/i "." >nul&&set bg=1
- if not exist %%~sa (
- echo."%%~a" 无法读取路径
- )
- if not defined bg (echo."%%~a" 是标准的文件夹) else (
- set bg=<nul
- for /f "delims= useback" %%b in ("%%~a") do (
- if not defined %%b (
- set res=1
- )
- )
- if defined res (echo."%%~a" 是普通txt样式&set res=<nul) else (
- echo."%%~a" 是标准的二进制文件
- )
- )
- )
- )
- pause
复制代码
作者: CrLf 时间: 2012-9-22 19:42
- (echo 文件<"测试文件or文件夹"||echo 文件夹) 2>nul
复制代码
作者: changedirectory 时间: 2013-12-11 11:28
- @echo off
- set str=
- for /f "delims=" %%i in ('dir /a-d /b test 2^>nul') do set str=%%i
- if defined str (echo test 是文件) else echo test 是文件夹
- pause
复制代码
本人是新手,看了很多namejm的文章,都是受益匪浅。我在实验了上面的批处理时,发现好像出现错误。复制代码
上面的命令无论是文件还是文件夹都提示不能找到,导致判断出错。本小白做了下修改,请各路大侠指点:- @echo off
- set str=
- for /f "delims=" %%i in ('dir /ad /b ^| findstr /be "test" 2^>nul') do set str=%%i
- if defined str (echo test 是文件夹) else echo test 是文件
- pause
复制代码
作者: ai20110304 时间: 2019-12-22 21:00
自带变量属性可以充分利用- FORFILES /M test /C "cmd /c if /i @isdir==true (echo test 是文件夹) else echo test是文件."
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |