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.

13voto

user2997241 Points 31

J'avais exactement le même problème. Vous pouvez utiliser quelque chose comme ceci :

$local = Get-Location;
$final_local = "C:\Processing";

if(!$local.Equals("C:\"))
{
    cd "C:\";
    if((Test-Path $final_local) -eq 0)
    {
        mkdir $final_local;
        cd $final_local;
        liga;
    }

    ## Si le chemin existe déjà
    ## Connexion à la base de données
    elseif ((Test-Path $final_local) -eq 1)
    {
        cd $final_local;
        echo $final_local;
        liga;  (fonction créée par vous TODO quelque chose)
    }
}

11voto

Klark Points 3906

Lorsque vous spécifiez le drapeau -Force, PowerShell ne se plaindra pas si le dossier existe déjà.

En une ligne :

Get-ChildItem D:\TopDirec\SubDirec\Project* | `
  %{ Get-ChildItem $_.FullName -Filter Revision* } | `
  %{ New-Item -ItemType Directory -Force -Path (Join-Path $_.FullName "Reports") }

Au fait, pour planifier la tâche, veuillez consulter ce lien : Planification des tâches en arrière-plan.

4voto

Mad Tom Vane Points 1146

De votre situation, il semble que vous deviez créer un dossier "Revision#" une fois par jour avec un dossier "Reports" à l'intérieur. Si c'est le cas, il vous suffit de savoir quel est le numéro de révision suivant. Écrivez une fonction qui obtient le numéro de révision suivant, Get-NextRevisionNumber. Ou vous pouvez faire quelque chose comme ceci :

foreach($Project in (Get-ChildItem "D:\TopDirec" -Directory)){
    # Sélectionnez tous les dossiers de révision du dossier du projet.
    $Revisions = Get-ChildItem "$($Project.Fullname)\Revision*" -Directory

    # Le numéro de révision suivant sera juste un de plus que le plus grand numéro.
    # Vous devez convertir la chaîne dans le premier pipeline en int pour que Sort-Object fonctionne.
    # Si vous le triez par ordre décroissant, le premier nombre sera le plus grand, donc vous le sélectionnez.
    # Une fois que vous avez le numéro de révision le plus élevé, ajoutez simplement un à celui-ci.
    $NextRevision = ($Revisions.Name | Foreach-Object {[int]$_.Replace('Revision','')} | Sort-Object -Descending | Select-Object -First 1)+1

    # Maintenant, avec ceci, on fait d'une pierre deux coups.
    # Il va créer le dossier "Reports" mais aussi le dossier "Revision#".
    New-Item -Path "$($Project.Fullname)\Revision$NextRevision\Reports" -Type Directory

    # Passons au dossier du projet suivant.
    # Cette boucle d'exemple non testée nécessite la version 3.0 de PowerShell.
}

Installation de PowerShell 3.0.

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