Мне известен тест 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
)