Это намного сложнее, чем большинство людей понимают. Существует много дезинформации об этой теме, доступной на SO и в других местах. Существует много «решений», которые, похоже, работают, но затем при определенных обстоятельствах терпят неудачу.
Проблема может быть разделена на две части:
1) абсолютного или относительного
Вы не можете просто преобразовать путь в полный путь, используя для переменной «%% ~ Ff» или параметр " % ~ f1 "и проверьте, совпадает ли он с исходной строкой (игнорируя регистр), потому что существует бесконечное количество способов, которыми может быть записан абсолютный путь. Действительный абсолютный путь может содержать любое число \..\
или \.\
. Кроме того, абсолютный путь может использовать букву диска, или это может быть UNC-путь. Кроме того, абсолютный путь может включать любое количество "
внутри него.
я тест, чтобы увидеть, если путь является абсолютным или относительным путем первого удаления всех цитат, а затем я использую FINDSTR, чтобы проверить, если он начинается с одним из следующих способов:
- Drive письма, а затем двоеточие, с последующим обратным слешем
- Два назад слэши
2) файл или папку, или не существует
Легко использовать IF EXISTS path
, чтобы узнать, действителен ли путь. Но сложнее выделить файл из папки.
В дни DOS вы можете проверить, существует ли path\NUL
, и если да, то вы знали, что путь был папкой. К сожалению, многие люди находятся под ложным впечатлением, что это работает под Windows - Это не является надежным под виндой
Другая частая попытка проверить, если path\
существует, и если да, то предположим, что она должна быть папка , Это часто, кажется, работает, но не работает, если путь включает в себя каталог символические ссылки или переходы
Код классификации Я хотел бы использовать почти такой же, как и для https://stackoverflow.com/a/8669636/1012053, за исключением того, я принял его для использования с переменная среды вместо параметра партии.
Я использую модификатор FOR переменной ~a
, чтобы посмотреть на атрибуты файла/папки. Если я найду d
, то это папка. если я нахожу атрибуты без d
, то это файл. Если я не могу найти атрибуты, то этого не существует.
Другой способ, который, как представляется, точно определить, существует ли папка, - это проверить, существует ли path\*
, но у меня меньше опыта с этим методом.
Так положить все это вместе, я получаю
@echo off
setlocal
set var=test.bat
setlocal enableDelayedExpansion
:: Determine absolute or relative
echo(!var:^"=!|findstr /i "^[A-Z]:[\\] ^[\\][\\]" >nul && set "type=absolute" || set "type=relative"
:: Determine file or folder or not exists
for /f eol^=^ delims^= %%F in ("!var!") do (
for /f "tokens=1,2 delims=d" %%A in ("-%%~aF") do if "%%B" neq "" (
echo %%F = %type% folder
) else if "%%A" neq "-" (
echo %%F = %type% file
) else (
echo %%F does not exist
)
)
Неа. Тест абсолютного пути может завершиться неудачно при наличии '..',' .', '' 'или UNC-пути. Тест'% short_path% \ nul' интригует, но терпит неудачу, если для тома отключены короткие пути 8.3 См. [Мой ответ] (http://stackoverflow.com/a/38170999/1012053) – dbenham