2012-01-18 99 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路徑中的空白 –

相關問題