2016-07-03 7 views
1

Я создаю сценарий летучей мыши, и я должен проверить, содержит ли переменная действительный абсолютный путь к каталогу, и если другая переменная содержит допустимое имя файла для Windows 8 и выше.Проверьте, действительно ли абсолютный путь к каталогу или имени файла

Итак, как я могу пройти эти проверки?

Благодаря

Bye

ответ

0

Вот самоочевидная код. Он ожидает аргумент, содержащий путь для проверки.

set "INPUT_PATH=%~1" 
set "FULL_PATH=%~f1" 
set "SHORT_PATH=%~s1" 
if /i "%INPUT_PATH%"=="%FULL_PATH%" echo this is a full path 
if exist "%INPUT_PATH%" echo this is an existing path 
if exist %SHORT_PATH%\NUL echo this is a directory 
+1

Неа. Тест абсолютного пути может завершиться неудачно при наличии '..',' .', '' 'или UNC-пути. Тест'% short_path% \ nul' интригует, но терпит неудачу, если для тома отключены короткие пути 8.3 См. [Мой ответ] (http://stackoverflow.com/a/38170999/1012053) – dbenham

5

Это намного сложнее, чем большинство людей понимают. Существует много дезинформации об этой теме, доступной на 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 
) 
) 
+0

Хороший ответ. Кстати, имеет ли пара в эхо (! Var ... есть какая-то цель? – wolfrevokcats

+1

@wolfrevokcats - я использовал 'ECHO (' вместо 'ECHO' просто в случайном случае результат расширения представляет собой пустую строку (или только пробелы). Но я просто понял, что она дает правильный ответ в любом случае. ECHOing пустая или пустая строка без ' 'приведет к тому, что' ECHO выключен', что приведет к определению «относительного», но вторая часть определит «не существует» (правильный ответ). Конечный результат - нет, нет веских оснований для использования 'echo (', но это тоже не повредит. – dbenham

+0

Есть ли особая техническая причина, по которой вы указываете классы символов для обратных косых черт '[\\]' вместо '\\' , или это просто для удобочитаемости? – aschipfl

 Смежные вопросы

  • Нет связанных вопросов^_^