Как проверить, является ли путь файлом или каталогом в пакетном файле Windows? - PullRequest
15 голосов
/ 29 декабря 2011

Я искал здесь, нашел кого-то, использующего это

set is_dir=0
for %%i in ("%~1") do if exist "%%~si"\nul set is_dir=1

но не сработало, когда %1==c:\this is a file with spaces.csproj, тест все еще успешен, что означает, что он все равно будет рассматриваться как папка !!!

кто-нибудь знает ответ, я думаю, что это очень распространенная проблема, и Windows существует уже много лет, и у нее должно быть очень простое решение ...

Ответы [ 5 ]

29 голосов
/ 29 декабря 2011

Мне известен тест if exist path\nul для папки, используемой для работы в MS-DOS. Я не знаю, сломался ли он с введением длинных имен файлов.

Я знал, что if exist "long path\nul" не работает в пакетном режиме Windows. До сегодняшнего дня я не осознавал, что if exist path\nul работает в Vista и более поздних версиях, пока путь находится в краткой форме 8.3.

Оригинальный код работает на Vista. Похоже, что он должен работать и на XP, но я считаю, что мешает следующая ошибка XP: Пакетный параметр% ~ s1 дает неверное 8.3 короткое имя .

Исходный код не нуждается в цикле FOR, он может просто использовать %~s1

Вот вариант, который полностью классифицирует путь как НЕВЕРНЫЙ, ФАЙЛ или ПАПКА. Он работает в Vista, но НЕ работает в XP из-за ошибки %~s1. Я не уверен, как это работает в MS-DOS.
РЕДАКТИРОВАТЬ 2015-12-08: существует ряд ситуаций Windows, когда это не удается

@echo off
if not exist "%~1" ( set "type=INVALID" ) else if exist %~s1\nul ( set "type=FOLDER" ) else ( set "type=FILE" )
@echo "%~1" = %type%

Я полагаю, что этот вариант будет работать практически со всеми версиями пакета Microsoft, включая MS-DOS и XP. (очевидно, он не будет работать на ранних версиях DOS, которые не поддерживают PUSHD)

@echo off
if exist "%~1" (2>nul pushd "%~1" && (popd&set "type=FOLDER") || set "type=FILE" ) else set "type=INVALID"
echo "%~1" = %type%

ОБНОВЛЕНИЕ 2014-12-26

Я уверен, что следующее будет работать на всех версиях Windows начиная с XP, но я тестировал только на Win 7.
Редактировать 2015-12-08: это может привести к сбою на сетевых дисках, поскольку при проверке папки может быть ошибочно сообщен файл как папка

@echo off
if exist %1\ (
  echo %1 is a folder
) else if exist %1 (
  echo %1 is a file
) else (
  echo %1 does not exist
)

ОБНОВЛЕНИЕ 2015-12-08

Наконец - тест, который действительно должен работать на любой версии Windows начиная с XP, включая сетевые диски и пути UNC

for /f "tokens=1,2 delims=d" %%A in ("-%~a1") do if "%%B" neq "" (
  echo %1 is a folder
) else if "%%A" neq "-" (
  echo %1 is a file
) else (
  echo %1 does not exist
)
7 голосов
/ 29 декабря 2011

Я только что попробовал таким образом. Надеюсь, это поможет.

@ECHO OFF
SET CURR_DIR=%CD%
SET IS_DIR=0
CD %1% 
IF "%ERRORLEVEL%"=="0" SET IS_DIR=1
CD %CURR_DIR%
ECHO IS DIRECTORY %IS_DIR% 

Выход:

D:\Work\Stand alone Java classes>test.bat D:\Work\Training
IS DIRECTORY 1

D:\Work\Stand alone Java classes>test.bat D:\Work\Training\SRT.txt
The directory name is invalid.
IS DIRECTORY 0
2 голосов
/ 31 декабря 2011

Параметр / ad для команды "dir" выводит список папок, параметр / b для пустых. Предполагая, что у вас есть проверки на наличие файла на месте, используйте:

dir /ad /b ChangeThisToYourFilename 1> NUL 2> NUL
if %ERRORLEVEL% EQU 0 (
    echo is a file
) else (
    echo is NOT a file
)
1 голос
/ 21 декабря 2013

Для 1 вкладыша:

dir /a:d /b C:\Windows 2>&1 | findstr /i /n /c:"File Not Found">nul && (@echo. Im a file) || (@echo. Im a folder)

например. изменить C:\Windows на C:\Windows\Notepad.exe

-Извините, Арун, Дбенхэм, не читал вашу! То же, что ..

0 голосов
/ 03 июля 2016

Раньше я использовал метод "\nul", но долгое время я использовал "\*", чтобы проверить, является ли существующая спецификация файла папкой или файлом. Насколько я знаю, он работает на всех версиях Windows, от Windows 95 (и, возможно, более ранних версий) до всех текущих версий Windows.

Итак, как и в случае с другими методами, сначала проверьте, существует ли файл. Затем, чтобы увидеть, является ли это папкой, протестируйте ее с помощью: if exist "%fspec%\*":

if not exist "%fspec%"   goto :NotExistOrInvalid

rem "%fspec%" is "Valid" and is either a "Folder", or a "File".
if     exist "%fspec%\*" goto :IsValidAndIsAFolder

rem "%fspec%" is a "File" (a "Regular File" or a Shortcut/Link).
goto :IsValidAndIsAFile

Например:

set "fspec=XYZ:%perlpath%"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem Invalid, goto :NotExistOrInvalid

set "fspec=%perlpath%"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem goto :NotExistOrInvalid

rem "%fspec%" Is a "Valid" filespec and is either a "Folder", or a "File".
if exist "%fspec%\*" (echo "%fspec%" is a "Folder".) else echo "%fspec%" is a "File".

set "fspec=%perlpath%\perl.exe"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem Invalid, goto :NotExistOrInvalid

rem "%fspec%" Is a "Valid" filespec and is either a "Folder", or a "File".
if exist "%fspec%\*" (echo "%fspec%" is a "Folder".) else echo "%fspec%" is a "File".

Выход для этого:

"XYZ:F:\usr\perl\bin": Invalid or not found
"F:\usr\perl\bin" is a "Folder".
"F:\usr\perl\bin\perl.exe" is a "File".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...