有没有办法找出文件是否是目录?
我在变量中有文件名。在Perl中,我可以这样做:
if(-d $var) { print "it's a directory\n" }
答案 0 :(得分:80)
这有效:
if exist %1\* echo Directory
使用包含空格的目录名:
C:\>if exist "c:\Program Files\*" echo Directory
Directory
请注意,如果目录包含空格,则必须使用引号:
C:\>if exist c:\Program Files\* echo Directory
也可以表示为:
C:\>SET D="C:\Program Files"
C:\>if exist %D%\* echo Directory
Directory
在家里尝试这是安全的,孩子们!
答案 1 :(得分:47)
你可以这样做:
IF EXIST %VAR%\NUL ECHO It's a directory
但是,这仅适用于名称中没有空格的目录。当您在变量周围添加引号以处理空格时,它将停止工作。要处理带空格的目录,请将文件名转换为短8.3格式,如下所示:
FOR %%i IN (%VAR%) DO IF EXIST %%~si\NUL ECHO It's a directory
%%~si
将%%i
转换为8.3文件名。要查看可以使用FOR
变量执行的所有其他技巧,请在命令提示符处输入HELP FOR
。
(注意 - 上面给出的示例是在批处理文件中使用的格式。要在命令行中使用它,请在两个位置将%%
替换为%
。)
答案 2 :(得分:43)
最近因上述不同方法而失败。相当肯定他们过去工作过,也许与dfs有关。现在使用files attributes并剪切第一个字符
@echo off
SETLOCAL ENABLEEXTENSIONS
set ATTR=%~a1
set DIRATTR=%ATTR:~0,1%
if /I "%DIRATTR%"=="d" echo %1 is a folder
:EOF
答案 3 :(得分:12)
继我之前的发布之后,我发现这也有效:
if exist %1\ echo Directory
%1周围不需要引号,因为调用者将提供它们。 这比一年前的答案节省了一整个击键次数; - )
答案 4 :(得分:9)
这是一个使用FOR构建完全限定路径的脚本,然后按下来测试路径是否是目录。请注意它如何适用于包含空格的路径以及网络路径。
@echo off
if [%1]==[] goto usage
for /f "delims=" %%i in ("%~1") do set MYPATH="%%~fi"
pushd %MYPATH% 2>nul
if errorlevel 1 goto notdir
goto isdir
:notdir
echo not a directory
goto exit
:isdir
popd
echo is a directory
goto exit
:usage
echo Usage: %0 DIRECTORY_TO_TEST
:exit
示例输出,上面保存为“isdir.bat”:
C:\>isdir c:\Windows\system32
is a directory
C:\>isdir c:\Windows\system32\wow32.dll
not a directory
C:\>isdir c:\notadir
not a directory
C:\>isdir "C:\Documents and Settings"
is a directory
C:\>isdir \
is a directory
C:\>isdir \\ninja\SharedDocs\cpu-z
is a directory
C:\>isdir \\ninja\SharedDocs\cpu-z\cpuz.ini
not a directory
答案 5 :(得分:6)
这完美无缺
if exist "%~1\" echo Directory
我们需要使用%~1来删除%1中的引号,并在结尾处添加反斜杠。然后再把全部放入qutes。
答案 6 :(得分:3)
我认为当目录名称中有SPACES时,使用“NUL”技术会有一些困难,例如“文档和设置”。
我正在使用Windows XP Service Pack 2并从%SystemRoot%\ system32 \ cmd.exe启动cmd提示
以下是一些不适用的例子以及对我有用的内容:
(这些都是在交互式提示下“现场”完成的演示。我认为在尝试在脚本中调试它们之前,你应该先在那里工作。)
此DID不起作用:
D:\Documents and Settings>if exist "D:\Documents and Settings\NUL" echo yes
此DID不起作用:
D:\Documents and Settings>if exist D:\Documents and Settings\NUL echo yes
这项工作(对我而言):
D:\Documents and Settings>cd ..
D:\>REM get the short 8.3 name for the file
D:\>dir /x
Volume in drive D has no label.
Volume Serial Number is 34BE-F9C9
Directory of D:\
09/25/2008 05:09 PM <DIR> 2008
09/25/2008 05:14 PM <DIR> 200809~1.25 2008.09.25
09/23/2008 03:44 PM <DIR> BOOST_~3 boost_repo_working_copy
09/02/2008 02:13 PM 486,128 CHROME~1.EXE ChromeSetup.exe
02/14/2008 12:32 PM <DIR> cygwin
[[看这里!!!! ]]
09/25/2008 08:34 AM <DIR> DOCUME~1 Documents and Settings
09/11/2008 01:57 PM 0 EMPTY_~1.TXT empty_testcopy_file.txt
01/21/2008 06:58 PM <DIR> NATION~1 National Instruments Downloads
10/12/2007 11:25 AM <DIR> NVIDIA
05/13/2008 09:42 AM <DIR> Office10
09/19/2008 11:08 AM <DIR> PROGRA~1 Program Files
12/02/1999 02:54 PM 24,576 setx.exe
09/15/2008 11:19 AM <DIR> TEMP
02/14/2008 12:26 PM <DIR> tmp
01/21/2008 07:05 PM <DIR> VXIPNP
09/23/2008 12:15 PM <DIR> WINDOWS
02/21/2008 03:49 PM <DIR> wx28
02/29/2008 01:47 PM <DIR> WXWIDG~2 wxWidgets
3 File(s) 510,704 bytes
20 Dir(s) 238,250,901,504 bytes free
D:\>REM now use the \NUL test with the 8.3 name
D:\>if exist d:\docume~1\NUL echo yes
yes
这有效,但有点傻,因为点已经暗示我在一个目录中:
D:\Documents and Settings>if exist .\NUL echo yes
答案 7 :(得分:3)
@ batchman61方法的变体(检查目录属性)。
这次我使用外部&#39;发现&#39;命令。
(哦,请注意&&
技巧。这是为了避免长期无聊的IF ERRORLEVEL
语法。)
@ECHO OFF
SETLOCAL EnableExtentions
ECHO.%~a1 | find "d" >NUL 2>NUL && (
ECHO %1 is a directory
)
输出是:
答案 8 :(得分:3)
这适用于处理带有空格的路径:
dir "%DIR%" > NUL 2>&1
if not errorlevel 1 (
echo Directory exists.
) else (
echo Directory does not exist.
)
在我看来,可能不是最有效但更容易阅读的其他解决方案。
答案 9 :(得分:2)
我用这个:
if not [%1] == [] (
pushd %~dpn1 2> nul
if errorlevel == 1 pushd %~dp1
)
答案 10 :(得分:2)
一种非常简单的方法是检查孩子是否存在。
如果孩子没有孩子,exist
命令将返回false。
IF EXIST %1\. (
echo %1 is a folder
) else (
echo %1 is a file
)
如果您没有足够的访问权限(我还没有测试过),您可能会有一些误报。
答案 11 :(得分:1)
基于this article标题为“批处理文件如何测试目录的存在”,它“不完全可靠”。
但我刚试过这个:
@echo off
IF EXIST %1\NUL goto print
ECHO not dir
pause
exit
:print
ECHO It's a directory
pause
似乎有效
答案 12 :(得分:1)
CD
返回一个EXIT_FAILURE
。并且您得到了conditional processing symbols,因此您可以像下面这样进行操作。
SET cd_backup=%cd%
(CD "%~1" && CD %cd_backup%) || GOTO Error
:Error
CD %cd_backup%
答案 13 :(得分:1)
我想发布一个关于这个主题的自己的函数脚本,希望有一天对某人有用。
@pushd %~dp1
@if not exist "%~nx1" (
popd
exit /b 0
) else (
if exist "%~nx1\*" (
popd
exit /b 1
) else (
popd
exit /b 3
)
)
此批处理脚本检查文件/文件夹是否存在以及文件或文件夹是否存在。
<强>用法:强>
script.bat“PATH”
退出代码:
0:文件/文件夹不存在。
1:存在,它是一个文件夹。
3:存在,它是一个文件。
答案 14 :(得分:1)
如果你可以cd
进入它,那就是一个目录:
set cwd=%cd%
cd /D "%1" 2> nul
@IF %errorlevel%==0 GOTO end
cd /D "%~dp1"
@echo This is a file.
@goto end2
:end
@echo This is a directory
:end2
@REM restore prior directory
@cd %cwd%
答案 15 :(得分:1)
这是我的解决方案:
REM make sure ERRORLEVEL is 0
TYPE NUL
REM try to PUSHD into the path (store current dir and switch to another one)
PUSHD "insert path here..." >NUL 2>&1
REM if ERRORLEVEL is still 0, it's most definitely a directory
IF %ERRORLEVEL% EQU 0 command...
REM if needed/wanted, go back to previous directory
POPD
答案 16 :(得分:0)
好的......&#39; nul&#39;如果在名称中使用引号,则该技巧不起作用,这些引号占大多数具有长文件名或空格的文件。
例如,
if exist "C:\nul" echo Directory
什么都不做,但是
if exist C:\nul echo Directory
作品。
我终于想出了这个,这似乎适用于所有情况:
for /f %%i in ('DIR /A:D /B %~dp1 ^| findstr /X /c:"%~nx1"') do echo Directory
或者如果您能确保满足&nbsp;&#39; nul&#39;解决方案是:
if exist %~sf1\nul echo Directory
将这些文件放入批处理文件中,例如&#39; test.bat&#39;并且做了测试.bat MyFile&#39;。
答案 17 :(得分:0)
在使用if,pushd,dir / AD等进行多次测试之后,这是我的解决方案......
@echo off
cd /d C:\
for /f "delims=" %%I in ('dir /a /ogn /b') do (
call :isdir "%%I"
if errorlevel 1 (echo F: %%~fI) else echo D: %%~fI
)
cmd/k
:isdir
echo.%~a1 | findstr /b "d" >nul
exit /b %errorlevel%
:: Errorlevel
:: 0 = folder
:: 1 = file or item not found
答案 18 :(得分:0)
这是我在BATCH文件中使用的代码
```
@echo off
set param=%~1
set tempfile=__temp__.txt
dir /b/ad > %tempfile%
set isfolder=false
for /f "delims=" %%i in (temp.txt) do if /i "%%i"=="%param%" set isfolder=true
del %tempfile%
echo %isfolder%
if %isfolder%==true echo %param% is a directory
```
答案 19 :(得分:0)
在Windows 7和XP下,我无法让它在映射的驱动器上告诉文件与dirs。以下脚本:
@echo off if exist c:\temp\data.csv echo data.csv is a file if exist c:\temp\data.csv\ echo data.csv is a directory if exist c:\temp\data.csv\nul echo data.csv is a directory if exist k:\temp\nonexistent.txt echo nonexistent.txt is a file if exist k:\temp\something.txt echo something.txt is a file if exist k:\temp\something.txt\ echo something.txt is a directory if exist k:\temp\something.txt\nul echo something.txt is a directory
产生
data.csv is a file something.txt is a file something.txt is a directory something.txt is a directory
因此,请注意您的脚本是否可能被提供映射或UNC路径。下面的推动解决方案似乎是最简单的。
答案 20 :(得分:0)
使用%%~si\NUL
方法的一个问题是它有可能猜错了。可能有一个文件名缩短到错误的文件。我不认为%%~si
解析8.3文件名,但猜测它,但使用字符串操作来缩短文件路径。我相信如果你有类似的文件路径,它可能无法正常工作。
另一种方法:
dir /AD %F% 2>&1 | findstr /C:"Not Found">NUL:&&(goto IsFile)||(goto IsDir)
:IsFile
echo %F% is a file
goto done
:IsDir
echo %F% is a directory
goto done
:done
您可以将(goto IsFile)||(goto IsDir)
替换为其他批处理命令:
(echo Is a File)||(echo is a Directory)
答案 21 :(得分:0)
如果您的目标是仅处理目录,那么这将很有用。
这取自https://ss64.com/nt/for_d.html
示例...在文件夹C:\ Work \下列出名称以“ User”开头的每个子文件夹:
CD \Work FOR /D /r %%G in ("User*") DO Echo We found
FOR /D
或FOR /D /R
@echo off
cd /d "C:\your directory here"
for /d /r %%A in ("*") do echo We found a folder: %%~nxA
pause
删除/r
只能进入一个文件夹。 /r
开关是递归的,未在下面的命令中进行记录。
从命令for /d
获得的for /?
帮助
FOR / D%IN输入变量(设置)DO命令[命令参数]
如果set包含通配符,则指定与目录匹配 名称而不是文件名。
答案 22 :(得分:0)
我最近也在寻找这个,并且偶然发现了一个对我有用的解决方案,但我不知道它有任何限制(因为我还没有发现它们)。我相信这个答案本质上与上面 TechGuy 的答案相似,但我想增加另一个层次的可行性。无论哪种方式,我都非常成功地将参数扩展为完整的文件路径,我相信您必须使用 setlocal enableextensions
才能使其正常工作。
使用下面我可以判断一个文件是一个目录还是相反的。这在很大程度上取决于用户的实际需要。如果您更喜欢在工作中使用搜索 errorlevel
与 &&
和 ||
的构造,您当然可以这样做。有时,errorlevel
的 if 构造可以为您提供更多灵活性,因为您不必使用有时会破坏环境条件的 GOTO
命令。
@Echo Off
setlocal enableextensions
Dir /b /a:D "%~f1" && Echo Arg1 is a Folder || Echo Arg1 is NOT a Folder
Dir /b /a:-D "%~f1" && Echo Arg1 is a File || Echo Arg1 is NOT a File
pause
使用它,您可以简单地将文件拖放到您正在构建的工具上以解析它们。相反,如果您使用其他方式来梳理文件结构并且您已经拥有该文件并且没有将它们拖放到批处理文件中,则可以实现:
@Echo Off
setlocal enableextensions
Dir /b /s "C:\SomeFolderIAmCombing\*" >"%~dp0SomeFiletogoThroughlater.txt"
For /f "Usebackq Delims=" %%a in ("%~dp0SomeFiletogoThroughlater.txt") do (
Call:DetectDir "%%a"
)
REM Do some stuff after parsing through Files/Directories if needed.
REM GOTO:EOF below is used to skip all the subroutines below.
REM Using ' CALL:DetectDir "%%a" ' with the for loop keeps the for
REM loop environment running in the background while still parsing the given file
REM in a clean environment where GOTO and other commmands do not need Variable Expansion.
GOTO:EOF
:DetectDir [File or Folder being checked]
REM Checks if Arg1 is a Directory. If yes, go to Dir coding. If not, go to File coding.
Dir /b /a:D "%~f1" && Echo Arg1 is a Folder & GOTO:IsDir || Echo Arg1 is NOT a Folder & GOTO:IsFile
REM Checks if Arg1 is NOT a Directory. If Yes, go to File coding. If not, go to Dir coding
Dir /b /a:-D "%~f1" && Echo Arg1 is a File & GOTO:IsFile || Echo Arg1 is NOT a File & GOTO:IsDir
:IsDir
REM Do your stuff to the Folder
GOTO:EOF
:IsFile
REM do your stuff to the File
GOTO:EOF
答案 23 :(得分:-2)
我们不能只用这个来测试:
IF [%~x1] == [] ECHO Directory
这似乎对我有用。