2
votes

powershell - crée une structure de sous-répertoire en ajoutant un zéro sur les mois à un chiffre

Je suis super nouveau sur PowerShell.

tentative de création d'une structure de répertoire de base aaaa / mm

ce qu'il crée:

      for ($i=2020; $i -le 2022;$i++) #years from 2020 to 2022
            { 
                for ($j=01; $j -le 12;$j++) # for months eg 01-12
                    {
                        New-Item -ItemType Directory -Path $path\$i\$j -Force
                    }
            }    

J'essaye d'ajouter un zéro aux mois jan = 01 ... 09 septembre. oct = 10, nov = 11, dec = 12

résultat désiré:

C:\2020
├───01
├───02
├───03
├───04
├───05
├───06
├───07
├───08
├───09
├───10
├───11
└───12

c'est la boucle imbriquée que j'ai. toutes les contributions sont appréciées. Merci d'avance

C:\2020
├───1
├───10
├───11
├───12
├───2
├───3
├───4
├───5
├───6
├───7
├───8
└───9


0 commentaires

4 Réponses :


4
votes

Vous devez utiliser PadLeft pour ajouter un zéro précédent ici.

PS >  "2".PadLeft(2, '0')
02
PS >  "2".PadLeft(3, '0')
002
PS >  "2".PadLeft(4, '0')
0002
PS >  "2".PadRight(4, '0')
2000
PS >  "2".PadLeft(5, 'a') 
aaaa2

2 = Combien de caractères au total la chaîne doit contenir.
'0' = Le caractère que vous souhaitez utiliser avant la valeur donnée.

De plus, votre variable doit être une chaîne pour PadLeft, donc je l'ai convertie en ce type - ([string]$j).PadLeft()

Par exemple

New-Item -ItemType Directory -Path "$path\$i\$(([string]$j).PadLeft(2, '0'))" -Force


0 commentaires

6
votes

Vous pouvez utiliser l'opérateur de format pour ajouter des zéros non significatifs. Voir https://ss64.com/ps/syntax-f-operator.html

2020..2022 | % {
    $year = $_
    1..12 | % {
        $month = "{0:d2}" -f $_
        New-Item -ItemType Directory -Path "$path\$year\$month" -Force
    }
}


0 commentaires

3
votes
for ($i=2020; $i -le 2022;$i++) { 
    for ($j=01; $j -le 12;$j++) {
        if ($j -le 9) {
            [system.io.directory]::CreateDirectory("$path\$i\0$j")
        } else {
            [system.io.directory]::CreateDirectory("$path\$i\$j")
        }
    }
}
I added an if statement with a '0'You'd do less computation on the entire list of objects, so it is a bit faster, and not too dissimilar to your original attempt.

3 commentaires

Cela fonctionne, ce qui est important. La raison la plus probable d'un vote négatif est qu'il ne fonctionne spécifiquement que pour deux chiffres (à moins que vous ne fassiez un elseif ou un sous-calcul plus compliqué avec des puissances de dix), plutôt que d'utiliser un formatage de chaîne plus générique. Personnellement, je considérerais cette optimisation prématurée, car les performances ne seront probablement pas un problème lors de la génération d'une si petite liste, et pour des listes plus grandes, vous devrez de toute façon refactoriser. Pas un problème pendant des mois de l'année, et cela fonctionne, donc je n'ai rien à redire à ce sujet en prod.


Je suis personnellement en désaccord avec cette réponse. Ajouter une branche à ce code juste pour gagner quelques ms est totalement inutile dans le contexte du problème. Powershell est un langage que vous utilisez parce qu'il est facile et que vous pouvez écrire rapidement des scripts, pas parce qu'il fonctionne bien (il y a des mots ici sur les développeurs qui vont vite). Juste un exemple: ForEach-Object est 5 à 10 fois plus lent que .{process{}} , mais les gens utilisent toujours ForEach-Object . La complexité supplémentaire et le travail ergonomique requis de la part des humains n'en valent pas la peine dans 99% des cas.


Je vois ce que vous dites, mais je trouve foreach | for plus rapide et plus lisible que % , et je pense qu'écrire les choses de manière plus lisible se prête à une meilleure facilité de maintenance, si ce script se trouve en cours d'exécution quelque part sur un planificateur de tâches dans le futur et que quelqu'un qui ne connaît pas PowerShell doit le réparer. Cela peut simplement être dû à l'environnement dans lequel je travaille. Je suis tout à fait d'accord que le temps d'écriture bat le temps de lecture, et vous faites des points valables.



4
votes

Une autre manière avec un objet datetime dans la boucle for. "|% tostring 00" remplit les 0 avec une entrée entière.

for ($date = [datetime]'1/2020'; $date -le '12/2022'; $date = $date.addMonths(1)) {
  mkdir "$($date.year)\$($date.month | % tostring 00)" -whatif
}


What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\01".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\02".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\03".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\04".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\05".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\06".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\07".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\08".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\09".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\10".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\11".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2020\12".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\01".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\02".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\03".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\04".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\05".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\06".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\07".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\08".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\09".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\10".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\11".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2021\12".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\01".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\02".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\03".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\04".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\05".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\06".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\07".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\08".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\09".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\10".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\11".
What if: Performing the operation "Create Directory" on target "Destination: C:\Users\js\2022\12".


0 commentaires