Frage

Gibt es eine Möglichkeit, um herauszufinden, ob eine Datei ein Verzeichnis ist?

Ich habe den Dateinamen in einer Variablen. In Perl kann ich dies tun:

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

Lösung

Sie können es wie folgt:

IF EXIST %VAR%\NUL ECHO It's a directory

Dies funktioniert jedoch nur für Verzeichnisse ohne Leerzeichen im Namen. Wenn Sie Anführungszeichen um die Variable hinzuzufügen, die Räume zu handhaben wird es aufhören zu arbeiten. So behandeln Sie Verzeichnisse mit Leerzeichen, konvertieren Sie die Dateinamen zu kurz 8.3-Format wie folgt:

FOR %%i IN (%VAR%) DO IF EXIST %%~si\NUL ECHO It's a directory

Die %%~si wandelt %%i zu einem 8.3-Dateinamen. Um alle anderen Tricks sehen Sie mit FOR Variablen eingeben HELP FOR an einer Eingabeaufforderung ausführen kann.

(Hinweis -.. Das obige Beispiel im Format gegeben ist in einer Batch-Datei zu arbeiten, um es auf der Kommandozeile bekommen arbeiten, ersetzen Sie die %% mit % an beiden Stellen)

Andere Tipps

Das funktioniert:

if exist %1\* echo Directory

Arbeiten mit Verzeichnisnamen, die Leerzeichen enthält:

C:\>if exist "c:\Program Files\*" echo Directory
Directory

Beachten Sie, dass die Anführungszeichen erforderlich sind, wenn das Verzeichnis Leerzeichen enthält:

C:\>if exist c:\Program Files\* echo Directory

auch wie folgt ausgedrückt werden kann:

C:\>SET D="C:\Program Files"
C:\>if exist %D%\* echo Directory
Directory

Dies ist sicher zu Hause zu versuchen, Kinder!

Vor kurzem mit unterschiedlichen Ansätzen aus dem obigen gescheitert. Ganz sicher, dass sie in der Vergangenheit gearbeitet, vielleicht im Zusammenhang hier dfs. Jetzt mit dem Dateien, die Attribute und schneiden erste Zeichen

@echo off
SETLOCAL ENABLEEXTENSIONS
set ATTR=%~a1
set DIRATTR=%ATTR:~0,1%
if /I "%DIRATTR%"=="d" echo %1 is a folder
:EOF

Zusätzlich zu meinem vorherigen Angebote, finde ich diese auch funktioniert:

if exist %1\ echo Directory

Keine Anführungszeichen% 1 benötigt werden, weil der Anrufer sie liefern wird. Das spart einen ganzen Tastendruck über meine Antwort vor einem Jahr; -)

Hier ist ein Skript, das für einen vollständigen Pfad zu bauen verwendet und dann pushd zu testen, ob der Pfad ein Verzeichnis ist. Beachten Sie, wie es funktioniert für Pfade mit Leerzeichen sowie Netzwerkpfade.

@echo off
if [%1]==[] goto usage

for /f "delims=" %%i in ("%~1") do set MYPATH="%%~fi"
pushd %MYPATH% 2>nul
if errorlevel 1 goto notdir
goto isdir

:notdir
echo not a directory
goto exit

:isdir
popd
echo is a directory
goto exit

:usage
echo Usage:  %0 DIRECTORY_TO_TEST

:exit

Beispiel für eine Ausgabe mit der oben gespeichert als "isdir.bat":

C:\>isdir c:\Windows\system32
is a directory

C:\>isdir c:\Windows\system32\wow32.dll
not a directory

C:\>isdir c:\notadir
not a directory

C:\>isdir "C:\Documents and Settings"
is a directory

C:\>isdir \
is a directory

C:\>isdir \\ninja\SharedDocs\cpu-z
is a directory

C:\>isdir \\ninja\SharedDocs\cpu-z\cpuz.ini
not a directory

Das funktioniert perfekt

if exist "%~1\" echo Directory

müssen wir% ~ 1 verwenden Zitate aus% 1, zu entfernen und ein Backslash am Ende hinzufügen. setzen thw Ganze in qutes dann wieder.

Die NUL Technik scheint nur auf 8.3-konformen Dateinamen zu arbeiten.

(Mit anderen Worten: `D: \ Dokumente und Einstellungen` sind "schlecht" und` D: \ DOCUME ~ 1 'ist "gut")


Ich denke, es gibt einige Schwierigkeiten, die „NUL“ tecnique verwenden, wenn es SPACES im Verzeichnisnamen, wie „Dokumente und Einstellungen“.

Ich verwende Windows XP Service Pack 2 und dem Start der cmd Aufforderung aus% SystemRoot% \ system32 \ cmd.exe

Hier sind einige Beispiele von dem, was nicht funktioniert hat und was Arbeit für mich TUT:

(Diese werden alle Demonstrationen „live“ in einer interaktiven Eingabeaufforderung getan. Ich vermute, dass man die Dinge bekommen sollte, dort zu arbeiten, bevor Sie versuchen, sie in einem Skript zu debuggen.)

Das hat nicht funktioniert:

D:\Documents and Settings>if exist "D:\Documents and Settings\NUL" echo yes

Das hat nicht funktioniert:

D:\Documents and Settings>if exist D:\Documents and Settings\NUL echo yes

Das funktioniert (für mich):

D:\Documents and Settings>cd ..

D:\>REM get the short 8.3 name for the file

D:\>dir /x

Volume in drive D has no label. Volume Serial Number is 34BE-F9C9

Directory of D:\
09/25/2008 05:09 PM <DIR> 2008
09/25/2008 05:14 PM <DIR> 200809~1.25 2008.09.25
09/23/2008 03:44 PM <DIR> BOOST_~3 boost_repo_working_copy
09/02/2008 02:13 PM 486,128 CHROME~1.EXE ChromeSetup.exe
02/14/2008 12:32 PM <DIR> cygwin

[[hier Schauen Sie !!!! ]]
09/25/2008 08:34 AM <DIR> DOCUME~1 Documents and Settings

09/11/2008 01:57 PM 0 EMPTY_~1.TXT empty_testcopy_file.txt
01/21/2008 06:58 PM <DIR> NATION~1 National Instruments Downloads
10/12/2007 11:25 AM <DIR> NVIDIA
05/13/2008 09:42 AM <DIR> Office10
09/19/2008 11:08 AM <DIR> PROGRA~1 Program Files
12/02/1999 02:54 PM 24,576 setx.exe
09/15/2008 11:19 AM <DIR> TEMP
02/14/2008 12:26 PM <DIR> tmp
01/21/2008 07:05 PM <DIR> VXIPNP
09/23/2008 12:15 PM <DIR> WINDOWS
02/21/2008 03:49 PM <DIR> wx28
02/29/2008 01:47 PM <DIR> WXWIDG~2 wxWidgets
3 File(s) 510,704 bytes
20 Dir(s) 238,250,901,504 bytes free

D:\>REM now use the \NUL test with the 8.3 name

D:\>if exist d:\docume~1\NUL echo yes

yes

Dies funktioniert, aber es ist irgendwie albern, weil der Punkt bereits i in einem Verzeichnis bin schon sagt:

D:\Documents and Settings>if exist .\NUL echo yes

Dies funktioniert und auch Griffe Pfade mit Leerzeichen in ihnen:

dir "%DIR%" > NUL 2>&1

if not errorlevel 1 (
    echo Directory exists.
) else (
    echo Directory does not exist.
)

Wahrscheinlich nicht die effizienteste, aber leichter zu lesen als die anderen Lösungen meiner Meinung nach.

Eine Variation @ batchman61 Ansatz (Überprüfung der Directory-Attribut).

Dieses Mal verwende ich einen externen Befehl ‚finden‘.

(Oh, und notieren Sie den && Trick. Dies ist die lange langweilig IF ERRORLEVEL Syntax zu vermeiden.)

@ECHO OFF
SETLOCAL EnableExtentions
ECHO.%~a1 | find "d" >NUL 2>NUL && (
    ECHO %1 is a directory
)

Ausgänge ja auf:

  • Verzeichnisse.
  • Verzeichnis symbolische Links oder Kreuzungen.
  • Gebrochene Verzeichnis symbolische Links oder Kreuzungen. (Versucht nicht, Links zu lösen.)
  • Verzeichnisse, die Sie keine Leseberechtigung auf (beispielsweise "C: \ System Volume Information") haben

Ich benutze diese:

if not [%1] == [] (
  pushd %~dpn1 2> nul
  if errorlevel == 1 pushd %~dp1
)

Eine sehr einfache Art und Weise ist zu überprüfen, ob das Kind vorhanden ist.

Wenn ein Kind kein Kind hat, wird der exist Befehl false zurück.

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

Sie können einige falsch-negative, wenn Sie nicht über ausreichende Zugriffsrecht haben kann (ich habe es nicht getestet).

Basierend auf diesem Artikel betitelte „Wie kann eine Batch-Datei Test Existenz eines Verzeichnisses“ es ist „nicht ganz zuverlässig“.

Aber ich gerade getestet dies:

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

und es scheint zu funktionieren

Hier ist meine Lösung:

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

Wenn Sie in es cd können, ist es ein Verzeichnis:

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%

Ich möchte meine eigene Funktion Skript zu diesem Thema Hoffnung schreiben für jemand eines Tages nützlich sein.

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

Diese Batch-Skript überprüft, ob Datei / Ordner vorhanden ist und ob es sich um eine Datei oder ein Ordner.

Verwendung:

script.bat "PATH"

Exit-Code (s):

0:. Datei / Ordner existiert nicht

. 1: existiert, und es ist ein Ordner

. 3: existiert, und es ist eine Datei

CD gibt ein EXIT_FAILURE wenn das angegebene Verzeichnis existiert nicht. Und Sie haben bedingte Verarbeitung Symbole , so dass Sie wie die unten dies tun könnte.

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

:Error
CD %cd_backup%

Unter Windows 7 und XP, kann ich es nicht Dateien vs. dirs auf zugeordnete Laufwerke zu erzählen. Das folgende Skript:

@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

erzeugt:

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

Also Vorsicht, wenn Ihr Skript könnte ein zugeordnetes oder UNC-Pfad zugeführt werden. Die pushd Lösung unten scheint die narrensicher zu sein.

Dies ist der Code, den ich in meinen Batch-Dateien

```
@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

`` `

Ok ... der ‚nul‘ Trick funktioniert nicht, wenn Sie Anführungszeichen in Namen verwenden, die für die meisten Dateien mit langen Dateinamen oder Räumen ausmachen.

Beispiel:

if exist "C:\nul" echo Directory

tut nichts, aber

if exist C:\nul echo Directory

funktioniert.

Ich kam schließlich mit diesem auf, die für alle Fälle schien zu funktionieren:

for /f %%i in ('DIR /A:D /B %~dp1 ^| findstr /X /c:"%~nx1"') do echo Directory

oder wenn Sie versichern, können Sie alle Anforderungen für ‚nul‘ eine Lösung erfüllen:

if exist %~sf1\nul echo Directory

Setzen Sie diese in eine Batch-Datei wie 'test.bat' und tun 'test.bat MyFile'.

Hier ist meine Lösung nach vielen Tests mit, wenn vorhanden, pushd, Richt / AD, etc ...

@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
  • Es arbeitet mit Dateien, die keine Erweiterung
  • haben
  • Es arbeitet mit Ordnern folder.ext
  • Es funktioniert mit UNC-Pfad
  • Es arbeitet mit doppelten Anführungszeichen vollständigen Pfad oder nur mit dem dirname oder Dateinamen nur.
  • Es funktioniert auch, wenn Sie nicht über Leseberechtigungen haben
  • Es funktioniert mit Nützliches Links (Junctions).
  • Es arbeitet mit Dateien, deren Pfad enthält ein Verzeichnis Link.

Ein Problem mit %%~si\NUL Methode besteht darin, dass es die Chance, dass es falsch errät. Es ist möglich, haben Sie einen Dateinamen in die falsche Datei verkürzen. Ich glaube nicht, %%~si die 8.3-Dateinamen auflöst, aber Vermutungen, aber String-Manipulation unter Verwendung den Dateipfad zu verkürzen. Ich glaube, wenn Sie ähnliche Dateipfade haben es nicht funktionieren kann.

Eine alternative Methode:

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

Sie können (goto IsFile)||(goto IsDir) mit anderen Batch-Befehle ersetzen:
(echo Is a File)||(echo is a Directory)

Können wir nicht nur mit diesem Test:

IF [%~x1] == [] ECHO Directory

Es scheint, für mich zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top