如何测试文件是否是批处理脚本中的目录?

Vha*_*run 67 windows command-line batch-file

有没有办法找出文件是否是目录?

我在变量中有文件名.在Perl中,我可以这样做:

if(-d $var) { print "it's a directory\n" }
Run Code Online (Sandbox Code Playgroud)

Ger*_*ard 85

这有效:

if exist %1\* echo Directory
Run Code Online (Sandbox Code Playgroud)

使用包含空格的目录名称:

C:\>if exist "c:\Program Files\*" echo Directory
Directory
Run Code Online (Sandbox Code Playgroud)

请注意,如果目录包含空格,则必须使用引号:

C:\>if exist c:\Program Files\* echo Directory
Run Code Online (Sandbox Code Playgroud)

也可以表示为:

C:\>SET D="C:\Program Files"
C:\>if exist %D%\* echo Directory
Directory
Run Code Online (Sandbox Code Playgroud)

孩子们在家里尝试这是安全的!

  • 真棒,**这个**甚至**与[目录链接]一起工作**(http://stackoverflow.com/questions/138981/how-do-i-test-if-a-file-is-a-directory -in-A-批处理脚本#comment14656200_138995)!但**只用`*`!!**(也是@GrantPeters) (10认同)
  • 为了防止引号出现问题,这也有效:如果存在"%~1 \"echo它是一个目录 (6认同)
  • 这似乎很好,它甚至正确地正确处理空文件夹.更新:似乎也不需要'*',只是结尾的'\'似乎足以验证它是一个文件夹. (4认同)

Dav*_*ebb 50

你可以这样做:

IF EXIST %VAR%\NUL ECHO It's a directory
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于名称中没有空格的目录.当您在变量周围添加引号以处理空格时,它将停止工作.要处理带空格的目录,请将文件名转换为短8.3格式,如下所示:

FOR %%i IN (%VAR%) DO IF EXIST %%~si\NUL ECHO It's a directory
Run Code Online (Sandbox Code Playgroud)

%%~si转换%%i到一个8.3文件名.要查看可以使用FOR变量执行的所有其他技巧,请HELP FOR在命令提示符下输入.

(注意 - 上面给出的示例是在批处理文件中使用的格式.要在命令行中使用它%%,请%在两个位置替换.)

  • 它不起作用.但是,最后添加一个反斜杠确实对我有用.例如:如果存在"%~1 \"echo它是一个目录 (9认同)
  • **这与[目录符号链接(软链接)或连接点]不起作用**(http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html):路径包含目录链接的文件被误识别为目录.要重现,请键入:<Win>`cmd` [<Ctrl> + <Shift> + <Enter>](http://blogs.msdn.com/b/tims/archive/2006/11/02/windows-vista -secret-10-open-an-elevated-command-prompt-in-six-keystrokes.aspx)`mklink/d LinkDir .` <Enter>`cd LinkDir` <Enter>`如果存在regedt32.exe \nul echo文件错误地检测为目录`<Enter>`rd .` (8认同)
  • 这有效:FOR %% i IN(%1)如果存在%% ~si\*ECHO是文件夹 (2认同)
  • 这也不适用于 UNC 路径(即 \\server\share\...)。@Vhaerun:请将您的“接受答案”标记更新为 batchman61 的标记 - 这是此页面上唯一可靠的答案 (2认同)

小智 46

最近因上述不同方法而失败.相当肯定他们过去工作过,也许与dfs有关.现在使用files属性并剪切第一个char

@echo off
SETLOCAL ENABLEEXTENSIONS
set ATTR=%~a1
set DIRATTR=%ATTR:~0,1%
if /I "%DIRATTR%"=="d" echo %1 is a folder
:EOF
Run Code Online (Sandbox Code Playgroud)

  • 这完全是最好的答案......如果你对目标文件或目录没有读取权限(这正是我需要的),它甚至可以工作.谢谢! (11认同)

Ger*_*ard 12

继我之前的产品之后,我发现这也有效:

if exist %1\ echo Directory
Run Code Online (Sandbox Code Playgroud)

%1周围不需要引号,因为调用者将提供它们.这比一年前的答案节省了一整个击键;-)

  • **这与[目录符号链接(软链接)或连接点]不起作用**(http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html):路径包含目录链接的文件被误识别为目录.要重现,请键入:<Win>`cmd` [<Ctrl> + <Shift> + <Enter>](http://blogs.msdn.com/b/tims/archive/2006/11/02/windows-vista -secret-10-open-an-elevated-command-prompt-in-six-keystrokes.aspx)`mklink/d LinkDir .` <Enter>`cd LinkDir` <Enter>`如果存在regedt32.exe\echo文件错误检测为目录`<Enter>`rd .` (5认同)

ind*_*div 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
Run Code Online (Sandbox Code Playgroud)

上面的示例输出保存为"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
Run Code Online (Sandbox Code Playgroud)

  • 这甚至适用于[目录符号链接(软链接)和连接点](http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html).(与`\ NUL`和`\`技术相反.) (2认同)

Azi*_*ziz 6

这非常有效

if exist "%~1\" echo Directory
Run Code Online (Sandbox Code Playgroud)

我们需要使用%~1来删除%1中的引号,并在结尾添加反斜杠.然后再将整体放入qutes中.

  • **这与[目录符号链接(软链接)或连接点]不起作用**(http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html):路径包含目录链接的文件被误识别为目录.要重现,请键入:<Win>`cmd` [<Ctrl> + <Shift> + <Enter>](http://blogs.msdn.com/b/tims/archive/2006/11/02/windows-vista -secret-10-open-an-elevated-command-prompt-in-six-keystrokes.aspx)`mklink/d LinkDir .` <Enter>`cd LinkDir` <Enter>`if existing"regedt32.exe"echo文件被错误地检测为目录`<Enter>`rd .` (3认同)