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


59

J'aimerais 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 s'il ne le crée pas, il le crée.


3
La commande linux / bash réelle serait tout simplement: mkdir -p myDirName. Après avoir passé des jours à essayer de traduire des scripts bash relativement simples en batch-sh * t (attribuer le résultat d'une fonction à une variable?), J'ai décidé de faire en sorte que les utilisateurs installent cygwin.
michael

Réponses:


73
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

Ajouté par Barlop

Bien que ce qui précède fonctionne pour cette situation particulière, le titre dit à propos de tester spécifiquement un répertoire. Le commentaire de Phogg utilisant if exist mydirname\plutôt que tel if exist mydirnamen'est le moyen. Certaines réponses ont utilisé \ nul mais \ nul est problématique dans NT. Si vous n'incluez pas de barre oblique inverse, vous testerez un fichier ou un répertoire. Donc, pour un répertoire, incluez la barre oblique inverse de fin.


23
Ceci est correct pour tester l'existence d'un fichier, mais comment savoir que c'est un répertoire? La réponse la plus simple est if exist mydirname\ et le reste, comme vous le dites. Alternativement, vous pouvez réellement obtenir un testbinaire et l'utiliser sous Windows.
Phogg

@phogg: Dans le contexte de cette question spécifique: s'il existe mais est un fichier, vous ne pouvez toujours pas le mkdirfaire.
Grawity

@grawity: S'il existe mais qu'il s'agit d'un fichier, le script échouera probablement plus tard si vous tentez de l'utiliser comme répertoire, ce qui n'est probablement pas ce que vous voulez.
Phogg

Comment puis-je vérifier s'il n'existe pas?
Sungguk Lim

1
@sunglim en écrivant `Si ce n'est pas le cas, myDirName \` de la même manière if not 1==1 echo hmm ou, s'il existe, monDirName \ ELSE blahblahblah
barlop le

20

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, le répertoire n'existe pas.

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

2
+1 - cela fonctionne dans toutes les versions de Windows et MS-DOS, contrairement à plain if exist dirnamequi semble être spécifique à Windows NT.
Grawity

c'était un code stupide comparé à linux mkdir -p myDirName: p
Kit Ho

6
Ce devrait être une barre oblique inverse, pas une barre oblique.
Nathan Garabedian

@grawity Que pensez-vous de cela cependant, apparemment un problème avec \ N de faire? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@barlop: Je pense que cmd.exe est l'un des pires langages de script existants et qu'il est préférable d'utiliser PowerShell ou toute autre solution de rechange. Pour \nulce qui est, ce n’est plus nécessaire dans Windows NT, cela if exist "C:\Program Files (x86)"devrait fonctionner
normalement

11

Utilisez une barre oblique inversée, pas une barre oblique: myDirName\nulpasmyDirName/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

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 la 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

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

SI EXIST nomFichier \ NUL

retournait VRAI pour les fichiers et les répertoires. J'ai trouvé une solution alternative sur www.robvanderwoude.com/battech_ifexistfolder.php et suis parvenu à une version révisée de la boucle FOR de 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 ) ) )

C'était la seule solution qui a fonctionné, merci. J'ai ajouté un "2> NUL" pour éviter le message d'erreur et j'ai changé les valeurs d'écho en 1 (le répertoire existe), 0 (le répertoire n'existe pas), -1 (un fichier du même nom existe) FOR% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (SI EXIST, A (ECHO -1) AUTRE (ECHO 0
Christoph

(désolé, je n'ai pas réussi à formater le code en tant que code dans la réponse bien que j'aie essayé beaucoup de choses :-( jusqu'à ce que le commentaire expiré au bout de 5 minutes :-()
Christoph

1

Je vois beaucoup de problèmes de différenciation entre les fichiers et les dossiers. Est-ce que quelqu'un a essayé de simplement y insérer un CD après avoir vérifié qu'il existe? Ensuite, 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
)

(1) Si vous allez utiliser une variable, utilisez-la. Toutes les occurrences de MyDiraprès la première ligne doivent être %MyDir%. (2) Le cd ..ne fera pas ce que vous voulez s'il %MyDir%s'agit d'un chemin à plusieurs niveaux (par exemple, Pictures\cats) ou même d'un chemin absolu (par exemple, \Windows). Pensez à utiliser pushd/ popdet / ou setlocal.
Scott

0
exist myDirName/nul

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


1
C:\blah>touch abe<ENTER>C:\blah>if exist abe\nul echo err<ENTER> C:\blah>if exist abe/nul echo err<ENTER>C:\blah>Je ne suis pas un fan de \ nul sous NT mais ce n’est pas le cas. Vous auriez dû donner une sortie.
barlop

-1

Trouver un dossier ne devrait pas être aussi difficile. Ma solution, utilisez perl:

pour ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt)
{
   if (-d "$ ARGV [$ cnt]") { 
      print "argv [$ cnt] = $ ARGV [$ cnt] est un dossier \ n";
      $ dir = $ ARGV [$ cnt];
      Pause;
   } autre {
      print "argv [$ cnt] = $ ARGV [$ cnt] n’est pas un dossier \ n";
   }
}

Je ne comprends pas
Pierre.Vriens
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.