Créer un dossier avec un lot mais uniquement s'il n'existe pas déjà

441

Quelqu'un peut-il me dire comment procéder comme suit dans un script batch Windows? ( *.bat):

  • Créer un dossier uniquement s'il n'existe pas déjà

Plus en détail, je veux créer un dossier nommé VTSsur le C:\lecteur, mais seulement si ce dossier n'existe pas déjà. Je ne veux pas écraser le contenu du dossier s'il existe déjà et que le lot est exécuté.

Facture
la source
2
Que dis-tu de ça ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

Réponses:

622

Vous utilisez juste ceci: if not exist "C:\VTS\" mkdir C:\VTSil créera un répertoire uniquement si le dossier n'existe pas.

Notez que ce test d'existence ne retournera vrai que si VTS existe et est un répertoire. S'il n'est pas là, ou s'il existe en tant que fichier, la commande mkdir s'exécutera et devrait provoquer une erreur. Vous voudrez peut-être vérifier si VTS existe également en tant que fichier.

Le Répondeur
la source
7
Sauf que c'est faux. Vous devez vérifier le périphérique NUL, sinon cela ne fonctionnera pas. Voir ma réponse trois ans plus tôt que celle-ci.
Martin Schapendonk
@MartinSchapendonk Cela fonctionne sur Windows 7 et Windows Server 2012 pour autant que je puisse en juger par les tests, et je serais très surpris si cela ne fonctionne pas au moins pour XP et jusqu'à Windows 10. Pouvez-vous fournir les conditions lorsque ça ne marche pas?
jpmc26
12
@ jpmc26 tester NUL, c'est s'assurer de tester un répertoire. Sinon, la condition peut être évaluée comme vraie, même s'il s'agit d'un fichier normal. Voilà la différence.
Martin Schapendonk
3
@MartinSchapendonk L'ajout d'une barre oblique de fin est-il suffisant pour cela? Cela semble distinguer correctement les fichiers et les répertoires, mais il y a une faiblesse en ce que si le fichier n'est pas détecté, la création du répertoire échouera. Je soupçonne que c'est aussi un problème avec les tests NUL.
jpmc26
6
@ jpmc26 Vous avez raison, une barre oblique de fin fait le travail et est en fait préférable car elle fonctionne avec des guillemets (vous permettant ainsi d'avoir des espaces dans le chemin du répertoire). Pour distinguer entre autre fichier / répertoire, cela fonctionnera: if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir"). À propos de votre dernière phrase, je soupçonne que quelque chose ne va pas avec votre fichier de commandes ailleurs.
Marc.2377
223
if exist C:\VTS\NUL echo "Folder already exists"

if not exist C:\VTS\NUL echo "Folder does not exist"

Voir également https://support.microsoft.com/en-us/kb/65994

(Mise à jour du 7 mars 2018; l'article de Microsoft est arrêté, archivez sur https://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994 )

Martin Schapendonk
la source
12
Personnellement, je préférerais cela car il ne définit pas% errorlevel% lorsque dir existe déjà (la réponse de Agent_9191 renvoie un code d'erreur de 1)
csauve
1
Il est également agréable et générique et peut être appliqué à toutes les autres actions que vous souhaitez effectuer sous condition :)
John Humphreys - w00te
3
@YouHaveaBigEgo NULest avec un L.
Martin Schapendonk
1
Le lien ne fonctionne plus, mais il y en a une copie aux Archives Internet
fernio
3
En fait, bien que cette réponse soit excellente, elle ne répond pas à la question de "créer un répertoire" :)
Jean-Francois T.
55

Appelez juste mkdir C:\VTSquoi qu'il arrive. Il signale simplement que le sous-répertoire existe déjà.

Modifier: Comme d'autres l'ont noté, cela définit le% ERRORLEVEL% si le dossier existe déjà. Si votre lot (ou tout processus qui l'appelle) ne se soucie pas du niveau d'erreur, cette méthode fonctionne bien. La question ne mentionnant pas d'éviter le niveau d'erreur, cette réponse est parfaitement valable. Il répond aux besoins de création du dossier s'il n'existe pas et n'écrase pas le contenu d'un dossier existant. Sinon, suivez la réponse de Martin Schapendonk .

Agent_9191
la source
20
il s'agit d'un mauvais comportement dû à un message d'erreur / avertissement inattendu.
SeriousM
11
Qualifier quelque chose de "parfaitement valable" lorsqu'elle viole les meilleures pratiques est intellectuellement malhonnête. Autre exemple: lorsque quelqu'un vous demande comment éviter un certain problème de sécurité spécifique, votre réponse ne doit pas être «exécuter l'ordinateur en tant qu'administrateur» même si la question ne spécifie pas explicitement l'impact minimal sur la sécurité comme condition préalable. :-)
Jouni Heikniemi
2
@JouniHeikniemi s / meilleures pratiques / préférences personnelles de Jouni
dss539
4
Rien de mal avec Errorlevel ou errno. Ce sont des paradigmes de messagerie d'erreur spécifiques à la plate-forme et ils fonctionnent dans le but pour lequel ils ont été conçus. Mais quelle que soit la plate-forme ou l'approche de messagerie, je ne recommanderais pas le modèle "essayez de faire cela et de récupérer en cas d'échec" lorsque vous pouvez facilement éviter - et donc documenter de manière lisible - le cas d'erreur courant. Par conséquent, je trouve les approches de style «sinon existe» supérieures. Mais je ne veux pas ou ne veux pas entrer trop profondément dans un débat sur la formation des meilleures pratiques. Je n'avais aucune intention d'offenser qui que ce soit, je voulais juste clarifier mon downvote.
Jouni Heikniemi
4
Le problème avec simplement ignorer l'erreur est que vous ne savez pas pourquoi elle a échoué. Il pourrait avoir échoué parce que le répertoire existait déjà, parce que l'utilisateur n'a pas d'autorisations sur ce répertoire, parce que le chemin parent n'existait pas ou parce que le disque était en panne. "Créer s'il n'existe pas" devrait échouer dans tous les cas sauf le premier. Cette réponse entraîne cependant une erreur dans tous les cas. C'est pourquoi il ne convient pas pour un script batch. -1
jpmc26
38
mkdir C:\VTS 2> NUL

créer un dossier appelé VTSet sortir A subdirectory or file TEST already existsvers NUL.

ou

(C:&(mkdir "C:\VTS" 2> NUL))&

changer la lettre de lecteur C:, mkdirerreur de sortie NULet exécutez la commande suivante.

3 ans2 tard
la source
Existe-t-il un moyen de faire fonctionner cela dans PowerShell? Il ne semble pas prendre en charge NULun fichier de sortie.
Aaron Franke
30
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)
Robie
la source
1
Comme d'autres l'ont souligné et vous l'avez peut-être vu dans la réponse la mieux notée, cela ne fonctionne pas si vous avez un fichier nommé log. C'est une différence subtile, mais cela entraînera des bogues difficiles à trouver dans vos scripts.
Abel
20

J'utilise de cette façon, vous devez mettre une barre oblique inversée à la fin du nom du répertoire pour éviter que cet endroit existe dans un fichier sans extension avec le même nom que le répertoire que vous avez spécifié, n'utilisez jamais "C: \ VTS" car il peut un fichier existe avec le nom "VTS" enregistré dans la partition "C:" , la bonne façon est d'utiliser "C: \ VTS \" , vérifiez la barre oblique inverse après le VTS , c'est donc la bonne façon.

@echo off
@break off
@title Create folder with batch but only if it doesn't already exist - D3F4ULT
@color 0a
@cls

setlocal EnableDelayedExpansion

if not exist "C:\VTS\" (
  mkdir "C:\VTS\"
  if "!errorlevel!" EQU "0" (
    echo Folder created successfully
  ) else (
    echo Error while creating folder
  )
) else (
  echo Folder already exists
)

pause
exit
D3F4ULT
la source
3
Ce qui est particulièrement intéressant de votre solution, c'est que vous utilisez !errorlevel!, c'est-à-dire l'expansion retardée. Sinon, la variable ERRORLEVELserait analysée avant d'entrer la première if(c'est-à-dire au moment de l'analyse). Maintenant, il est analysé au moment de l'exécution, il peut donc capturer le résultat de mkdir. Vous avez également raison, même si vous testez l'existence, vous devez toujours tester le succès (pensez: erreur d'accès refusé, par exemple). Très bonne solution par rapport aux autres, +10 !!!
Abel
17

Vous pouvez utiliser:

if not exist "C:\VTS\" mkdir "C:\VTS"

Vous pouvez également développer le code pour remplacer tous les fichiers attendus manquants.

if not exist "C:\VTS\important.file" echo. > "C:\VTS\important.file"

la source
0

j'ai créé ceci pour mon script que j'utilise dans mon travail pour eyebeam.

:CREATES A CHECK VARIABLE

set lookup=0

:CHECKS IF THE FOLDER ALREADY EXIST"

IF EXIST "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\" (set lookup=1)

:IF CHECK is still 0 which means does not exist. It creates the folder

IF %lookup%==0 START "" mkdir "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\"
Winston
la source