Как проверить, является ли файл каталогом в пакетном скрипте? - PullRequest
63 голосов
/ 26 сентября 2008

Есть ли способ узнать, является ли файл каталогом?

У меня есть имя файла в переменной. В Perl я могу сделать это:

if(-d $var) { print "it's a directory\n" }

Ответы [ 22 ]

2 голосов
/ 26 июля 2012

Очень простой способ проверить, существует ли ребенок.

Если у ребенка нет ребенка, команда exist вернет false.

IF EXIST %1\. (
  echo %1 is a folder
) else (
  echo %1 is a file
)

У вас может быть ложный отрицательный результат, если у вас недостаточно прав доступа (я его не проверял).

1 голос
/ 26 сентября 2008

На основании этой статьи под названием «Как пакетный файл может проверить наличие каталога», «это не совсем надежно».

НО я только что проверил это:

@echo off
IF EXIST %1\NUL goto print
ECHO not dir
pause
exit
:print
ECHO It's a directory
pause

и похоже на работу

1 голос
/ 29 июля 2018

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

SET cd_backup=%cd%
(CD "%~1" && CD %cd_backup%) || GOTO Error

:Error
CD %cd_backup%
1 голос
/ 20 сентября 2017

Я хотел бы опубликовать свой собственный функциональный скрипт на эту тему, надеюсь, что он когда-нибудь пригодится.

@pushd %~dp1
@if not exist "%~nx1" (
        popd
        exit /b 0
) else (
        if exist "%~nx1\*" (
                popd
                exit /b 1
        ) else (
                popd
                exit /b 3
        )
)

Этот пакетный скрипт проверяет, существует ли файл / папка и является ли он файлом или папкой.

Использование:

script.bat "PATH"

Код (ы) выхода:

0: файл / папка не существует.

1: существует, и это папка.

3: существует, и это файл.

1 голос
/ 07 июня 2013

Вот мое решение:

REM make sure ERRORLEVEL is 0
TYPE NUL

REM try to PUSHD into the path (store current dir and switch to another one)
PUSHD "insert path here..." >NUL 2>&1

REM if ERRORLEVEL is still 0, it's most definitely a directory
IF %ERRORLEVEL% EQU 0 command...

REM if needed/wanted, go back to previous directory
POPD
1 голос
/ 25 октября 2015

Если вы можете cd в него, это каталог:

set cwd=%cd%

cd /D "%1" 2> nul
@IF %errorlevel%==0 GOTO end

cd /D "%~dp1"
@echo This is a file.

@goto end2
:end
@echo This is a directory
:end2

@REM restore prior directory
@cd %cwd%
0 голосов
/ 13 июля 2012

Это код, который я использую в моих пакетных файлах

```
@echo off
set param=%~1
set tempfile=__temp__.txt
dir /b/ad > %tempfile%
set isfolder=false
for /f "delims=" %%i in (temp.txt) do if /i  "%%i"=="%param%" set isfolder=true
del %tempfile%
echo %isfolder%
if %isfolder%==true echo %param% is a directory

`` `

0 голосов
/ 08 сентября 2010

Одна из проблем, связанных с использованием метода %%~si\NUL, заключается в том, что существует вероятность, что он угадает неправильно. Возможно, имя файла будет сокращено до неправильного файла. Я не думаю, что %%~si разрешает имя файла 8.3, но угадывает его, но использует манипуляции со строками для сокращения пути к файлу Я считаю, что если у вас есть похожие пути к файлам, это может не сработать.

Альтернативный метод:

dir /AD %F% 2>&1 | findstr /C:"Not Found">NUL:&&(goto IsFile)||(goto IsDir)

:IsFile
  echo %F% is a file
  goto done

:IsDir
  echo %F% is a directory
  goto done

:done

Вы можете заменить (goto IsFile)||(goto IsDir) другими пакетными командами:
(echo Is a File)||(echo is a Directory)

0 голосов
/ 13 июля 2011

В Windows 7 и XP я не могу заставить их сравнивать файлы и каталоги на подключенных дисках. Следующий скрипт:

@echo off
if exist c:\temp\data.csv echo data.csv is a file
if exist c:\temp\data.csv\ echo data.csv is a directory
if exist c:\temp\data.csv\nul echo data.csv is a directory
if exist k:\temp\nonexistent.txt echo nonexistent.txt is a file
if exist k:\temp\something.txt echo something.txt is a file
if exist k:\temp\something.txt\ echo something.txt is a directory
if exist k:\temp\something.txt\nul echo something.txt is a directory

производит:

data.csv is a file
something.txt is a file
something.txt is a directory
something.txt is a directory

Так что будьте осторожны, если ваш сценарий может быть представлен сопоставленным или UNC-путем. Представленное ниже решение pushd представляется наиболее надежным.

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