Как проверить, является ли цель пути каталогом? - PullRequest
3 голосов
/ 18 января 2012

Как проверить, является ли целью данного пути каталог?

Скажи:

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 и локальными путями
  • с пробелами в пути
  • с или без завершающей обратной косой черты в конце
  • в случае, если содержимое недоступно

В крайних случаях, например, когда невозможно сказать (разрешения), запасное значение может быть нет, это не каталог .

Ответы [ 4 ]

5 голосов
/ 18 января 2012

Попробуйте этот совет от Microsoft :

Команду if нельзя использовать для прямого тестирования каталога, но для устройства с нулевым (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

Поместите это в пакетный файл - ему нужнобыть вызванным с именем данного объекта, который вы хотите проверить, например, myBat \\\myUncPath.Вы также можете поставить шаблон, тогда он распечатает все каталоги по заданному пути - \\\myUncPath\\* напечатает все каталоги в \\\myUncPath

Примечание. Это должно работать в Windows 2000 и более поздних версиях с включенными расширениями команд (не на NT4 к сожалению).Я проверял это на XP.

2 голосов
/ 18 января 2012

Чтобы увидеть, существует ли 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, если он еще не назначен) с указанием пути и компакт-диска в нем, и вернет уровень ошибки, равный 0. Если он не существует, команда завершится неудачно и вернется уровень ошибки 1.

Если вы хотите выйти из пути UNC, используйте команду POPD

0 голосов
/ 24 ноября 2014

Вот мое решение после многих тестов, если существует, 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 path
  • Работает с полным путем в двойных кавычках или только с именем или именем файла.
  • Это работает, даже если у вас нет прав на чтение
  • Работает со ссылками на каталоги (соединениями).
  • Работает с файлами, путь которых содержит ссылку на каталог.
0 голосов
/ 18 января 2012

Вы можете проверить, существует ли %somepath%\NUL:

if exist %somepath%\NUL set isdir=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...