web-dev-qa-db-fra.com

Créer un dossier dans un script batch et ignorer s'il existe

Comment créer un dossier (et des sous-dossiers) dans un script batch? Ce qui est important, si un dossier (ou des sous-dossiers) existe déjà, il ne devrait pas renvoyer d'erreur.

Par exemple, quelque chose comme ceci:

  • mkdir mydir - succès (le répertoire est maintenant créé)
  • mkdir mydir\subdir - succès (maintenant mydir contient subdir)
  • mkdir mydir - succès (le dossier existe déjà, devrait pas générer une erreur)
  • mkdir mydir\subdir - succès (les dossiers existent déjà, devraient pas générer une erreur)

Ce dont j'ai réellement besoin est juste de m'assurer que la structure des dossiers existe.

3
steavy

Une méthode standard pour créer une structure de répertoires est:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

md "%Directory%" 2>nul
if not exist "%Directory%\*" (
    echo Failed to create directory "%Directory%"
    pause
    goto :EOF
)

rem Other commands after successful creation of the directory.
endlocal

Par défaut, les extensions de commande sont activées et l'expansion différée est désactivée. Le code de commandes ci-dessus configure explicitement cet environnement.

La commande [~ # ~] md [~ # ~] crée la structure complète du répertoire dans le répertoire spécifié avec les extensions de commande activées.

[~ # ~] md [~ # ~] génère une erreur si le répertoire existe déjà. Cela peut être utile pour informer un utilisateur saisissant la commande manuellement d'une erreur possible dans le chemin d'accès au répertoire, car il se peut que l'utilisateur ait voulu créer un nouveau répertoire et qu'il ait simplement entré par erreur le nom d'un répertoire déjà existant.

Mais pour l'utilisation scriptée de la commande [~ # ~] md [~ # ~] , il est souvent problématique que cette commande génère un message d'erreur si le répertoire créer existe déjà. Il serait vraiment utile que la commande [~ # ~] md [~ # ~] ait une option pour ne pas afficher de message d'erreur en cas de répertoire pour créer déjà existant et sortant avec le code retour 0 dans ce cas. Mais il n'y a pas une telle option.

La solution ci-dessus crée le répertoire et supprime peut-être un message d'erreur de sortie en le redirigeant de la poignée [~ # ~] stderr [~ # ~] vers le périphérique [~ # ~] nul [~ # ~] .

Mais la création du répertoire pourrait échouer en raison d'un caractère non valide dans le chemin du répertoire, lecteur non disponible (sur l'utilisation du chemin complet), il y a n'importe où dans le chemin un fichier avec le nom d'un répertoire spécifié, les autorisations NTFS ne permettent pas la création du répertoire , etc.

Il est donc conseillé de vérifier si le répertoire existe vraiment ce qui se fait avec:

if not exist "%Directory%\*"

Il est important que le chemin du répertoire se termine maintenant par \* ou au moins avec une barre oblique inverse. Sinon, il pourrait être possible pour l'exemple qu'il existe un fichier avec le nom subdir 2 dans le répertoire mydir\subdir 1 qui lors de l'utilisation de la condition if not exist "%Directory%" serait évalué à faux bien qu'il n'y ait pas de répertoire subdir 2.

Il est bien sûr également possible de faire d'abord la vérification du répertoire et de créer le répertoire s'il n'est pas déjà existant.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

if not exist "%Directory%\*" (
    md "%Directory%"
    if errorlevel 1 (
        pause
        goto :EOF
    )
)

rem Other commands after successful creation of the directory.
endlocal

L'utilisateur peut maintenant voir le message d'erreur généré par la commande [~ # ~] md [~ # ~] si la structure du répertoire n'a pas pu être créée en expliquant brièvement la raison.

Ce code de lot pourrait être écrit plus compact en utilisant l'opérateur ||:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

if not exist "%Directory%\*" md "%Directory%" || pause & goto :EOF

rem Other commands after successful creation of the directory.
endlocal

Pour plus de détails sur les opérateurs || et & lire la réponse sur ne seule ligne avec plusieurs commandes utilisant un fichier batch Windows .

La commande [~ # ~] endlocal [~ # ~] n'est pas utilisée avant goto: EOF car cette commande nécessite également extensions de commande activées. L'interpréteur de commandes Windows exécute cette commande implicitement en quittant l'exécution du fichier de commandes.

Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commandes, exécutez-y les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.

  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • md /?
  • pause /?
  • set /?
  • setlocal /?

Lisez également l'article de Microsoft sur tilisation des opérateurs de redirection de commandes .

6
Mofi

Vous devez vérifier le chemin et créer s'il n'existe pas

if not exist mydir\subdir md mydir\subdir

Ou vous pouvez également rediriger stderr

md mydir\subdir 2>NUL

Vous n'avez pas besoin d'exécuter mkdir mydir d'abord parce que

MD crée des répertoires intermédiaires dans le chemin, si nécessaire.

lorsque les extensions de commande sont activées

https://ss64.com/nt/md.html

9
phuclv