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
4 Réponses :
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
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 } }
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.
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.
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".