Gibt es eine Möglichkeit herauszufinden, ob eine Datei ein Verzeichnis ist?
Ich habe den Dateinamen in einer Variablen. In Perl kann ich das tun:
if(-d $var) { print "it's a directory\n" }
quelle
Gibt es eine Möglichkeit herauszufinden, ob eine Datei ein Verzeichnis ist?
Ich habe den Dateinamen in einer Variablen. In Perl kann ich das tun:
if(-d $var) { print "it's a directory\n" }
Sie können es so machen:
IF EXIST %VAR%\NUL ECHO It's a directory
Dies funktioniert jedoch nur für Verzeichnisse ohne Leerzeichen in ihren Namen. Wenn Sie die Variable in Anführungszeichen setzen, um die Leerzeichen zu verarbeiten, funktioniert sie nicht mehr. Um Verzeichnisse mit Leerzeichen zu verarbeiten, konvertieren Sie den Dateinamen wie folgt in das kurze 8.3-Format:
FOR %%i IN (%VAR%) DO IF EXIST %%~si\NUL ECHO It's a directory
Das %%~si
konvertiert %%i
in einen 8.3-Dateinamen. Um alle anderen Tricks zu sehen, die Sie mit FOR
Variablen ausführen können, geben Sie HELP FOR
an einer Eingabeaufforderung ein.
(Anmerkung - das oben angegebene Beispiel ist in dem Format zur Arbeit in einer Batch - Datei , um es auf der Kommandozeile zu bekommen, tauschen Sie die. %%
Mit %
an beiden Orten.)
cmd
Gebenmklink /d LinkDir .
Sie zum Reproduzieren Folgendes ein: <Win> <Strg> + <Umschalt> + <Eingabe> <Eingabe>cd LinkDir
<Eingabe>if exist regedt32.exe\nul echo File erroneously detected as Directory
<Eingabe>rd .
Das funktioniert:
Funktioniert mit Verzeichnisnamen, die Leerzeichen enthalten:
Beachten Sie, dass die Anführungszeichen erforderlich sind, wenn das Verzeichnis Leerzeichen enthält:
Kann auch ausgedrückt werden als:
Dies ist sicher zu Hause zu versuchen, Kinder!
quelle
*
!! (Auch @GrantPeters)Kürzlich mit anderen Ansätzen als oben gescheitert. Ganz sicher, dass sie in der Vergangenheit gearbeitet haben, vielleicht im Zusammenhang mit dfs hier. Verwenden Sie nun die Dateiattribute und schneiden Sie das erste Zeichen aus
@echo off SETLOCAL ENABLEEXTENSIONS set ATTR=%~a1 set DIRATTR=%ATTR:~0,1% if /I "%DIRATTR%"=="d" echo %1 is a folder :EOF
quelle
Nach meinem vorherigen Angebot funktioniert dies auch:
Es sind keine Anführungszeichen um% 1 erforderlich, da der Anrufer diese bereitstellt. Das spart einen ganzen Tastendruck gegenüber meiner Antwort von vor einem Jahr ;-)
quelle
cmd
Gebenmklink /d LinkDir .
Sie zum Reproduzieren Folgendes ein: <Win> <Strg> + <Umschalt> + <Eingabe> <Eingabe>cd LinkDir
<Eingabe>if exist regedt32.exe\ echo File erroneously detected as Directory
<Eingabe>rd .
Hier ist ein Skript, das FOR verwendet, um einen vollständig qualifizierten Pfad zu erstellen, und dann pushd, um zu testen, ob der Pfad ein Verzeichnis ist. Beachten Sie, wie es für Pfade mit Leerzeichen sowie für Netzwerkpfade funktioniert.
Beispielausgabe mit dem oben als "isdir.bat" gespeicherten:
quelle
\NUL
und `` Techniken.)`…`
Inline-Code-Formatierung geändert .) «` `» Sollte «\
» sein. Ich bezog mich auf den Ansatz, einen Backslash am Ende des Dateinamens anzuhängenDas funktioniert perfekt
Wir müssen% ~ 1 verwenden, um Anführungszeichen aus% 1 zu entfernen und am Ende einen Backslash hinzuzufügen. Dann das Ganze wieder in Qutes geben.
quelle
cmd
Gebenmklink /d LinkDir .
Sie zum Reproduzieren Folgendes ein: <Win> <Strg> + <Umschalt> + <Eingabe> <Eingabe>cd LinkDir
<Eingabe>if exist "regedt32.exe\" echo File erroneously detected as Directory
<Eingabe>rd .
Eine Variation des Ansatzes von @ batchman61 (Überprüfen des Directory-Attributs).
Diesmal benutze ich einen externen 'find'-Befehl.
(Oh, und beachten Sie den
&&
Trick. Dies dient dazu, die langweiligeIF ERRORLEVEL
Syntax zu vermeiden .)Ausgänge ja ein:
quelle
Die NUL-Technik scheint nur mit 8.3-kompatiblen Dateinamen zu funktionieren.
(Mit anderen Worten, "D: \ Dokumente und Einstellungen" ist "schlecht" und "D: \ DOCUME ~ 1" ist "gut")
Ich denke, es gibt einige Schwierigkeiten bei der Verwendung der "NUL" -Technik, wenn der Verzeichnisname SPACES enthält, z. B. "Dokumente und Einstellungen".
Ich verwende Windows XP Service Pack 2 und starte die Eingabeaufforderung cmd über% SystemRoot% \ system32 \ cmd.exe
Hier sind einige Beispiele dafür, was NICHT funktioniert hat und was für mich funktioniert:
(Dies sind alles Demonstrationen, die "live" an einer interaktiven Eingabeaufforderung durchgeführt werden. Ich denke, Sie sollten die Dinge dort zum Laufen bringen, 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
[[Schau gleich hier !!!! ]]
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
Das funktioniert, aber es ist irgendwie albern, weil der Punkt bereits impliziert, dass ich in einem Verzeichnis bin:
D:\Documents and Settings>if exist .\NUL echo yes
quelle
cmd
Gebenmklink /d LinkDir .
Sie zum Reproduzieren Folgendes ein: <Win> <Strg> + <Umschalt> + <Eingabe> <Eingabe>cd LinkDir
<Eingabe>if exist regedt32.exe\nul echo File erroneously detected as Directory
<Eingabe>rd .
Ich benutze das:
quelle
Dies funktioniert und behandelt auch Pfade mit Leerzeichen:
Wahrscheinlich nicht die effizienteste, aber meiner Meinung nach leichter zu lesen als die anderen Lösungen.
quelle
cd
... erinnern Sie sich natürlich an Ihr aktuelles Verzeichnisset cwd=%cd%
, um es später wiederherzustellen ...CD
Gibt ein zurück,EXIT_FAILURE
wenn das angegebene Verzeichnis nicht vorhanden ist. Und Sie haben bedingte Verarbeitungssymbole , sodass Sie dies wie folgt tun können.quelle
Eine sehr einfache Möglichkeit besteht darin, zu überprüfen, ob das Kind existiert.
Wenn ein Kind kein Kind hat, gibt der
exist
Befehl false zurück.Möglicherweise haben Sie ein falsches Negativ, wenn Sie nicht über ausreichende Zugriffsrechte verfügen (ich habe es nicht getestet).
quelle
Wenn Sie hinein können
cd
, ist es ein Verzeichnis:quelle
Basierend auf diesem Artikel mit dem Titel "Wie kann eine Batch-Datei die Existenz eines Verzeichnisses testen" ist sie "nicht ganz zuverlässig".
ABER ich habe das gerade getestet:
und es scheint zu funktionieren
quelle
cmd
Gebenmklink /d LinkDir .
Sie zum Reproduzieren Folgendes ein: <Win> <Strg> + <Umschalt> + <Eingabe> <Eingabe>cd LinkDir
<Eingabe>if exist "regedt32.exe\NUL" echo File erroneously detected as Directory
<Eingabe>rd .
Hier ist meine Lösung:
quelle
Ich möchte mein eigenes Funktionsskript zu diesem Thema veröffentlichen, um eines Tages für jemanden nützlich zu sein.
Dieses Batch-Skript prüft, ob eine Datei / ein Ordner vorhanden ist und ob es sich um eine Datei oder einen Ordner handelt.
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.
quelle
Unter Windows 7 und XP kann ich keine Dateien oder Verzeichnisse auf zugeordneten Laufwerken erkennen. Das folgende Skript:
produziert:
Achten Sie also darauf, ob Ihrem Skript möglicherweise ein zugeordneter oder ein UNC-Pfad zugewiesen wird. Die unten stehende Pushd-Lösung scheint die narrensicherste zu sein.
quelle
Dies ist der Code, den ich in meinen BATCH-Dateien verwende
`` `
quelle
Hier ist meine Lösung nach vielen Tests mit if exist, pushd, dir / AD, etc ...
quelle
Ein Problem bei der Verwendung der
%%~si\NUL
Methode besteht darin, dass die Möglichkeit besteht, dass sie falsch vermutet wird. Es ist möglich, dass ein Dateiname auf die falsche Datei verkürzt wird. Ich glaube nicht, dass%%~si
der 8.3-Dateiname aufgelöst wird, aber ich vermute es, aber ich benutze String-Manipulation, um den Dateipfad zu verkürzen. Ich glaube, wenn Sie ähnliche Dateipfade haben, funktioniert es möglicherweise nicht.Eine alternative Methode:
Sie können durch
(goto IsFile)||(goto IsDir)
andere Stapelbefehle ersetzen :(echo Is a File)||(echo is a Directory)
quelle
%~s1
der kurze Dateiname wird natürlich nicht "erraten" / manipuliert, sondern korrekt aufgelöst. Wiedir /x
Wenn Sie nur Verzeichnisse verarbeiten möchten, ist dies hilfreich.
Dies ist der https://ss64.com/nt/for_d.html entnommen
FOR /D
oderFOR /D /R
Entfernen,
/r
um nur einen Ordner tief zu gehen. Der/r
Schalter ist rekursiv und im folgenden Befehl nicht dokumentiert.Die
for /d
Hilfe vom Befehl genommenfor /?
quelle
Können wir nicht einfach damit testen:
Es scheint für mich zu funktionieren.
quelle
myfolder.fld
?