如何检查路径的目标是否是目录?

时间:2012-01-18 11:30:30

标签: windows batch-file cmd

如何检查给定路径的目标是否是目录?

说:

rem all these should work (by X: I mean a mapped UNC path)
set somepath=some\path
set somepath=c:\some\path
set somepath=x:\some\path
set somepath=\\server\some\path
set isdir=

rem now do some extremely complicated black magic to set %isdir%

if not _%isdir%_==__ (
    rem do the directory thing
)

它应该尽可能地与这些案例一起使用:

  • 在Windows NT上(即不是Vista +的东西)。
  • 使用UNC路径和本地路径
  • 路径中有空格
  • 在结尾处有或没有反斜杠
  • 以防无法访问内容

在极端情况下,例如无法告知(权限)时,后备值可以是 no,它不是目录

4 个答案:

答案 0 :(得分:5)

试试这个advice from Microsoft

  

您无法使用 if 命令直接测试目录,但是   每个目录中都存在null(NUL)设备。结果,你   可以测试空设备以确定目录是否存在。   以下示例测试是否存在目录:

if exist c:\mydir\nul goto process'

对于UNC路径,我提出了:

@echo off
for /D %%I IN (%1) DO for /F "tokens=1 delims=-r" %%J IN ("%%~aI") DO if %%J==d echo  %%I is a directory

将其放入批处理文件中 - 需要使用您要验证的给定对象的名称来调用它,例如: G。 myBat \\\myUncPath。您也可以放一个通配符,然后打印出给定路径中的所有目录 - \\\myUncPath\\*将在\\\myUncPath

中打印所有目录

注意:这应该适用于Windows 2000及更高版本,并且启用了命令扩展(不幸的是,不适用于NT4)。我在XP上测试过它。

答案 1 :(得分:2)

查看UNC路径是否存在:

set somepath=\some\path\NUL
CALL:2 "%somepath%"
GOTO:EOF

:2
PUSHD "%~dp1"
IF [%errorlevel%] == [0] (
  ECHO IT EXISTS
  POPD
) ELSE (
  ECHO IT DOES NOT EXIST
)

如果存在,它将创建一个网络驱动器(Z,如果尚未分配),其中包含路径和CD,并返回错误级别0.如果它不存在,则命令失败,并返回错误级别为1。

如果要打破UNC路径,请使用命令POPD

答案 2 :(得分:0)

您可以检查%somepath%\NUL是否存在:

if exist %somepath%\NUL set isdir=1

答案 3 :(得分: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
  • 适用于没有扩展名的文件
  • 适用于名为folder.ext
  • 的文件夹
  • 适用于UNC路径
  • 它适用于双引号完整路径或仅使用dirname或文件名。
  • 即使您没有读取权限也可以使用
  • 适用于目录链接(连接点)。
  • 适用于路径包含目录链接的文件。