2012-01-18 101 views
3

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

说:

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路径以及本地路径
  • 与路径空间
  • 具有或不具有在末端尾部反斜杠
  • 在壳体内容是不可访问

在极端的情况下,像,当它不能被告知(权限),回退值可能是不,这不是目录

+0

你应该为了给它所需的可视性 –

+2

这个问题是一个重复的问题,更好的标记你的问题: http://stackoverflow.com/questions/138981/how-do-i- test-if-a-file-is-a-a-directory-in-a-batch-script –

+0

您需要指定您想要的UNC路径。这对你的要求有很大的不同。另外,你想弄清楚\ some \ path是一个目录还是一个文件?或者你想只知道它是否存在? – Mechaflash

回答

5

试试这个advice from Microsoft

您不能使用如果命令直接测试目录,但 空(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

注:这应该启用(而不是在NT4不幸)命令扩展在Windows 2000及更高版本。我在XP上测试过它。

+0

正如我已经发布到其他答案:这不幸的是不适用于UNC路径: 'exists \\ server \ share \ dir \ NUL'永远不会是真的。 –

+0

变得有趣:-)我编辑了我的答案以包含您的要求 – wmz

+0

+1我喜欢“UNC”解决方案。它应该适用于所有情况,是吗? – dbenham

0

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

if exist %somepath%\NUL set isdir=1 
+1

对不起,但这不适用于UNC路径:'\\ server \ share \ NUL'永远不存在' –

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

+0

我看不到Z:创建的部分。或者PUSHD是否自动执行?听起来很可怕...... 如果所有的字母都已被拍摄,该怎么办? –

+0

PUSHD自动分配驱动器号(从字母表的末尾开始)。这只是当前CMD会话中的暂时,只要你记得事后调用“POPD”。但是,最坏的情况是,如果您不调用POPD,注销或重新启动将清除暂时分配的驱动器盘符。就所有驱动器号被用完而言,该命令应该失败。如果A-Z在您的系统上真的用完了,您可能需要考虑使用宏应用程序访问网络共享,而不是使用驱动器分配。此外,您映射的网络路径越多,失去的性能就越高 – Mechaflash

+0

此外,它仅映射可用的驱动器号。如果说在映射两条路径时已经分配了x和y驱动器,它将使用z和w。 – Mechaflash

0

这里是许多后我的解决办法测试与如果存在,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或文件名。
  • 即使您没有读取权限,它也能正常工作
  • 它适用于目录链接(连接点)。
  • 它适用于路径中包含目录链接的文件。
+0

不适用于Windows 10上的UNC路径中的空白 –

相关问题