424 votes

Créer un répertoire s'il n'existe pas

Je suis en train d'écrire un script PowerShell pour créer plusieurs répertoires s'ils n'existent pas.

Le système de fichiers ressemble à ceci

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • Chaque dossier de projet a plusieurs révisions.
  • Chaque dossier de révision a besoin d'un dossier Reports.
  • Certains des dossiers "révisions" contiennent déjà un dossier Reports; cependant, la plupart ne le font pas.

Je dois écrire un script qui s'exécute quotidiennement pour créer ces dossiers pour chaque répertoire.

Je suis capable d'écrire le script pour créer un dossier, mais la création de plusieurs dossiers pose problème.

6 votes

"créer plusieurs dossiers pose problème" - quel genre de problème rencontrez-vous? Vous ne savez pas comment écrire le code? Recevez-vous un message d'erreur? Les dossiers n'apparaissent-ils simplement pas après l'exécution du script? Des problèmes différents nécessitent des solutions différentes.

656voto

Andy Arismendi Points 16501

Essayez le paramètre -Force :

New-Item -ItemType Répertoire -Force -Chemin C:\Chemin\Qui\Peut\Exister\Ou\Non

Vous pouvez utiliser Test-Path -PathType Conteneur pour vérifier d'abord.

Consultez l'article d'aide MSDN de New-Item pour plus de détails.

123 votes

Pour les paresseux, il existe une abréviation : md -Force c:\foo\bar\baz

89 votes

Pour ceux qui ne veulent aucun affichage lorsque le dossier est créé, ajoutez "| Out-Null" à la fin

32 votes

Que fera réellement -Force? La documentation dit "Force cette cmdlet à créer un élément qui écrit sur un élément en lecture seule existant". Supprimera-t-il un dossier existant? Cela devrait être clair dans cette réponse.

204voto

Guest Points 1931
$chemin = "C:\temp\NouveauDossier"
Si(!(test-path -PathType container $chemin))
{
      New-Item -ItemType Directory -Path $chemin
}

Test-Path -PathType container vérifie si le chemin existe et est un dossier. Lorsque ce n'est pas le cas, il créera un nouveau dossier. Si le chemin existe mais est un fichier, New-Item lèvera une erreur (vous pouvez écraser le fichier en utilisant l'argument -force si vous êtes téméraire).

0 votes

Super! Cela silence la sortie si le répertoire existe déjà (car il utilise test-path).

2 votes

Pourquoi l'option -Force?

6 votes

@KCD pour tenir compte du Répertoire de Schrödinger

20voto

Le code suivant vous aide à créer un chemin complet.

Fonction GenerateFolder($path) {
    $global:foldPath = $null
    foreach($foldername in $path.split("\")) {
        $global:foldPath += ($foldername+"\")
        if (!(Test-Path $global:foldPath)){
            New-Item -ItemType Directory -Path $global:foldPath
            # Write-Host "$global:foldPath Dossier créé avec succès"
        }
    }
}

La fonction ci-dessus divise le chemin que vous avez passé à la fonction et vérifiera si chaque dossier existe ou non. S'il n'existe pas, il créera le dossier correspondant jusqu'à ce que le dossier cible/final soit créé.

Pour appeler la fonction, utilisez l'instruction suivante :

GenerateFolder "H:\Desktop\Nithesh\SrcFolder"

1 votes

Cette traduction n'est pas la plus simple, mais elle est facile à comprendre.

0 votes

Supposons que j'ai un chemin "\\shared1\folder1\" et que je veux créer un dossier LOGS dans ce chemin, s'il n'existe pas, comment puis-je coder ? Parce que \\shared1\folder1\ est une variable et non une valeur codée en dur. Je veux dire, \\shared1\folder1\LOGS doit être créé s'il n'existe pas.

19voto

filimonic Points 1041
[System.IO.Directory]::CreateDirectory('chemin complet vers le répertoire')

Cela vérifie automatiquement l'existence du répertoire et en crée un s'il n'existe pas. Juste une ligne de code et une méthode native .NET fonctionnant parfaitement.

0 votes

Puis-je utiliser un chemin local / relatif vers mon répertoire de travail actuel?

0 votes

@AaronFranke tu peux le faire en utilisant [System.IO.Path]::Combine($PWD.Path, 'répertoireRelatif')

17voto

Kyle Points 141

Utilisation:

$chemin = "C:\temp\"

Si (!(test-path $chemin))
{
    md $chemin
}
  • La première ligne crée une variable nommée $chemin et lui attribue la valeur de chaîne "C:\temp"

  • La deuxième ligne est une instruction If qui repose sur la cmdlet Test-Path pour vérifier si la variable $chemin n'existe pas. Le non-existe est qualifié en utilisant le symbole !.

  • Troisième ligne: Si le chemin stocké dans la chaîne ci-dessus n'est pas trouvé, le code entre les accolades sera exécuté.

md est la version raccourcie de taper: New-Item -ItemType Répertoire -Chemin $chemin

Note : Je n'ai pas testé l'utilisation du paramètre -Force avec ce qui suit pour voir s'il y a un comportement indésirable si le chemin existe déjà.

New-Item -ItemType Répertoire -Chemin $chemin

1 votes

Cela fonctionne également pour une hiérarchie de répertoires md "C:\premier\deuxième\troisième crée-les tous.

0 votes

Dans l'exemple ci-dessus, si le troisième n'existe pas, comment puis-je créer un "dossier appelé "third" ?

1 votes

Il devrait lire md $path au lieu de `md C:\Temp`.

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