89 votes

Comment tester si un fichier est un répertoire dans un script Batch?

Est-il possible de dire si un fichier est un répertoire? J'ai le nom de fichier dans une variable. En Perl, je peux faire ceci:

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

106voto

Gerard Points 321

Cela semble fonctionner:

if exist %1\* echo Directory

Semble trop facile, et il y a un reproche à l'arrière de mon cerveau qui dit de ne pas le faire. Quelqu'un sait pourquoi pas?

70voto

batchman61 Points 169

récemment échoué avec des approches différentes de ce qui précède, tout à fait sûr qu'ils ont travaillé dans le passé, peut-être liées à la dfs ici. maintenant, en utilisant les fichiers d'attributs et de couper d'abord char

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

61voto

Dave Webb Points 90034

Vous pouvez le faire comme ceci:

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

Toutefois, cela ne fonctionne que pour les répertoires sans les espaces dans leur nom. Lorsque vous ajoutez des guillemets tour de la variable pour gérer les espaces qu'il va arrêter de travailler. Pour gérer les répertoires avec des espaces, de convertir le nom du fichier à court format 8.3 comme suit:

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

L' %%~si convertit %%i d'un nom de fichier 8.3. Pour voir tous les autres trucs que vous pouvez effectuer avec FOR variables d'entrée HELP FOR à l'invite de commande.

(Remarque - dans l'exemple donné ci-dessus est le format de travail dans un fichier de commandes. Pour le faire fonctionner sur la ligne de commande swap à la fois l' %% pour %.)

12voto

Gerard Points 321

Suite à ma précédente offre, je trouve cela fonctionne aussi:

if exist %1\ echo Directory

Pas de guillemets autour de %1 sont nécessaires parce que l'appelant d'approvisionnement. Cela permet d'économiser un ensemble de touches sur ma réponse d'il y a un an ;-)

11voto

indiv Points 7403

Voici un script qui utilise POUR construire un chemin d'accès complet, et puis pushd pour tester si le chemin est un répertoire. Remarquez comment il fonctionne pour les chemins avec des espaces, ainsi que les chemins d'accès au réseau.

@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

Exemple de sortie ci-dessus sont enregistrés en tant que "isdir.chauve-souris":

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X