2010-12-06 16:36:13 +0000 2010-12-06 16:36:13 +0000
64
64

Comment vérifier si un répertoire existe dans Windows ?

Je souhaite traduire ce script Linux/Bash en shell Windows :

if test -d myDirName; then echo "ok"; else mkdir myDirName; fi

Il teste si un répertoire existe, et si ce n'est pas le cas, il le crée.

Réponses (9)

79
79
79
2010-12-06 16:47:52 +0000
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

Ajouté par Barlop

Bien que ce qui précède s'applique à cette situation particulière, le titre parle de tests spécifiques pour un répertoire. Le commentaire de Phogg utilisant if exist mydirname @echo off IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created) `

Ajouté par Barlop

Bien que ce qui précède s'applique à cette situation particulière, le titre parle de tests spécifiques pour un répertoire. Le commentaire de Phogg utilisant plutôt que if exist mydirname est la solution. Certaines réponses ont utilisé \nul mais \nul est problématique dans NT. Ne pas inclure de backslash à la fin du commentaire permet de tester pour un fichier ou un répertoire. Donc, pour un répertoire, il faut inclure la barre oblique inversée.

21
21
21
2011-12-06 11:52:52 +0000

Voici ce que je viens de découvrir :

Vous pouvez tester si un fichier nul existe ; si le répertoire existe, il contiendra un fichier nul, si le fichier nul n'existe pas, alors le répertoire n'existe pas.

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
11
11
11
2012-05-12 15:36:37 +0000

Utilisez une barre oblique inverse, pas une barre oblique directe : myDirName\nul pas myDirName/nul

md foo 
echo.>bar 
for %I in (foo bar xyz) do @( 
  if exist %I ( 
    if exist %I\nul ( 
      echo -- %I is a directory 
    ) else ( 
      echo -- %I is a file 
    ) 
  ) else ( 
    echo -- %I does not exist 
  ) 
)

– foo est un répertoire – bar est un fichier – xyz n'existe pas

edit : cela ne fonctionne que si le nom du répertoire ne contient pas d'espaces

5
5
5
2014-06-03 11:10:57 +0000

Certains ont suggéré de faire \nul, mais cela ne semble pas fonctionner de manière fiable dans NT

C:\blah>md abc

C:\blah>if exist abc\nul echo yes
yes

C:\blah>if exist "abc\nul" echo yes

C:\blah>

http://www.dostips.com/forum/viewtopic.php?f=3&t=4913

foxidrive writes-

The trick with nul worked in pre NT versions of windows.

Now you would use this, with a trailing backslash.

if exist "C:\abcde\" echo the folder exists

Re the question

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
no

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
yes

C:\blah>
4
4
4
2013-10-11 11:29:44 +0000

Je me suis demandé pourquoi Joe avait un vote négatif alors que je rencontrais le même genre de problème sous Windows 7, à savoir que

IF EXIST nom de fichier\NUL

renvoyait TRUE pour les fichiers et les répertoires. J'ai trouvé une solution alternative à www.robvanderwoude.com/battech_ifexistfolder.php et j'ai proposé une version révisée de la boucle FOR de la DVF :

FOR %I in (foo bar xyz) DO @( PUSHD %I && (POPD & echo -- %I is a directory) || ( IF exist %I ( echo -- %I is a file ) ELSE ( echo -- %I does not exist ) ) )
1
1
1
2014-06-03 09:50:53 +0000

Je vois que beaucoup ont des problèmes pour différencier les fichiers et les dossiers. Quelqu'un a-t-il essayé d'y entrer simplement en cd après avoir vérifié son existence ? Alors le cd réussira ou échouera.

set MyDir = "MyTestDir"
IF exist MyDir (
    cd MyDir 
    IF ERRORLEVEL NEQ 0 (
        echo "Error: %MyDir% already exists, but it is a file!"
        exit 1
    ) else (
        # Do not forget to cd back
        cd ..
    )
) else (
   # Did not exist yet, so create it.
   mkdir MyDir
)
0
0
0
2019-11-09 14:56:24 +0000

Je préfère utiliser dir /d | findstr \[\.\.\] :

2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName&&echo= Is NOT dir

2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName

Pour créer si existe ou non et pour ignorer l'erreur…

2>nul mkDir myDirName

Aussi …

if exist "myDirName\." (echo/"ok") else mkdir myDirName

rem :: or direct create myDirName hidden/ignoring error
       2>nul mkdir myDirName & if exist "myDirName\." echo/ exist 
rem :: output: exist
0
0
0
2012-05-04 10:41:48 +0000
exist myDirName/nul

est également vrai si myDirName est un fichier, mais ce n'est pas la fonctionnalité recherchée

-1
-1
-1
2018-08-24 18:31:30 +0000

Trouver un dossier ne devrait pas être si difficile. Ma solution, utiliser perl :

for($cnt=$#ARGV; $cnt\>=0; --$cnt) { if ( -d "$ARGV[$cnt]" ) { print "argv[$cnt]=$ARGV[$cnt] is a folder\n"; $dir = $ARGV[$cnt]; break; } else { print "argv[$cnt]=$ARGV[$cnt] is Not a folder\n"; } }