Répertoires multiples: équivalent Powershell de «mkdir dir {1..9}»?

11

Quelle est la syntaxe pour créer plusieurs répertoires avec PowerShells md (ou mkdir, New-Item ...) équivalent à la commande 'nix mkdir ch{1..9}ie

~/parent_dir/  
ch1/  
ch2/  
ch3/  
ch4/  
ch5/  
ch6/  
ch7/  
ch8/  
ch9/  

J'ai cherché dans les pages de manuel et get-help des exemples, mais je ne connais pas la syntaxe pour PowerShell pour faire une chose aussi simple. Je vous remercie.

M. Kennedy
la source

Réponses:

16

Quelle est la syntaxe pour créer plusieurs répertoires avec PowerShell

Utilisez la commande suivante:

0..9 | foreach $_{ New-Item -ItemType directory -Name $("ch" + $_) }

Comment ça fonctionne:

  • 0..9l' opérateur de plage .. génère la séquence de nombres 0, 1, ... 9
  • les nombres sont redirigés | vers la commande suivante
  • foreach boucles (à travers chaque numéro à tour de rôle)
  • { ... }est un bloc de script
  • New-Item -ItemType directory -Name $("ch" + $_) crée les répertoires
  • $_est une variable automatique qui représente l'objet actuel dans le pipeline (le nombre)

Exemple:

> 0..9 | foreach $_{ New-Item -ItemType directory -Name $("ch" + $_) }


    Directory: F:\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       25/09/2016     14:57                ch0
d-----       25/09/2016     14:57                ch1
d-----       25/09/2016     14:57                ch2
d-----       25/09/2016     14:57                ch3
d-----       25/09/2016     14:57                ch4
d-----       25/09/2016     14:57                ch5
d-----       25/09/2016     14:57                ch6
d-----       25/09/2016     14:57                ch7
d-----       25/09/2016     14:57                ch8
d-----       25/09/2016     14:57                ch9
DavidPostill
la source
3
Il n'y a rien de moins verbeux que de saisir ce qui suit 1..9 | % $_{ md -name $("ch" + $_) }:?
M. Kennedy du
1
Je le pense. Mais je ne suis pas un expert PowerShell.
DavidPostill
1
Ça a l'air bien, mais je vous suggère de l'essayer et de voir :)
DavidPostill
1
a-HA - compris 1..9 | % $_{ mv ch$_*.* ch$_ }:: ^ D
M. Kennedy
1
@ Mr.Kennedy Couple choses. Vous devriez essayer d'exécuter le git addet voir ce qu'il renvoie - gardez à l'esprit que $_dans chaque foreach se trouve uniquement chaque entrée de tableau individuelle du dernier élément du pipeline (ce qui signifie que l' commitétape de votre exemple n'obtiendra pas de nombres bruts, donc l'ajout à chnouveau est probablement faux ). De plus, dans votre exemple, les validations ne s'exécuteraient (?) Qu'après la fin de tous les ajouts, ce qui signifie que la première validation obtiendrait tout ... Alternativement, vous pouvez utiliser plusieurs instructions (séparées par ;) à l'intérieur d'une seule étape foreach.
Bob
22

Vous n'avez pas besoin d'appeler mkdir plusieurs fois, car vous New-Itempouvez prendre un tableau de chemins. Par exemple:

mkdir $(1..9 | %{"ch$_"})

@DavidPostill a expliqué la plupart des concepts dans sa réponse . Cela profite également de l' interpolation de chaînes au lieu d'effectuer une concaténation explicite. De plus, le %raccourci est utilisé à la place de ForEach-Object, mais a la même signification.

Malheureusement, il ne semble pas être un moyen facile d'interpoler une chaîne dans un tableau de chaînes comme dans bash.

Bob
la source
2
@DavidPostill Vous avez expliqué beaucoup plus en détail que moi. Cela pourrait être plus un addendum à votre réponse: P
Bob
2
@DavidPostill s'il vous plaît ne le supprimez pas - votre explication est très utile
M. Kennedy
3
Version maximale golfée:md(0..9|%{"ch$_"})
Ben N
2
@DavidPostill mdest un alias standard pour mkdir, qui est une fonction PowerShell. %, comme Bob l'a mentionné, est un alias standard pour ForEach-Object. Les chaînes entre guillemets doubles interpolent les variables, "ch$_"est donc équivalent à 'ch' + $_. Vous pouvez rechercher un alias en exécutant Get-Command( gcm) dessus.
Ben N
1
@ Mr.Kennedy Quelque chose comme: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}ou 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Ces commentaires deviennent un peu longs maintenant, donc si vous avez d'autres questions - veuillez les poser en tant que questions, ou peut-être passer au chat.
Bob
1

J'utiliserais pour la version en boucle car elle est facile à retenir et peut être appliquée à de nombreuses situations. Même il peut être utilisé pour plusieurs commandes.

Pour un équivalent de cette commande bash:

pour i dans {1..9}; faire
mkdir ch $ j'ai
fait

... dans l'utilisation de PowerShell:

for($i=1;
$i -le 10;
$i++)
{md ch$i}
Osman Mamun
la source
mamum, pourriez-vous clarifier - je reçois une erreur lorsque j'exécute votre code à partir de la ligne de commande PowerShell, ou, en tant que script ps1: Missing opening '(' after keyword 'for'.Cette commande: foreach ($i in 1..9) {md ch$i}me fait numéroter les répertoires apter "ch", mais je ne comprends pas votre "pour. ..; do ... done "boucle.
M. Kennedy
La boucle for que j'ai utilisée ici est pour le shell bash (/ bin / sh). Je change toujours mon shell en bash car je suis habitué à ce shell. Pour ps, vous devez utiliser une syntaxe différente pour la boucle for (veuillez consulter le lien joint ss64.com/ps/for.html )
Osman Mamun
1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}merci mamun, mais je ne suis pas encore "Bourne encore ...";) (je ne connais pas non plus le C ++, mais je pense que je comprends en quelque sorte ce "$ i-le" (si inférieur ou égal à?) Et "$ i ++" (~ "i + = 1"?) signifie et fait dans la commande ...
M. Kennedy
1
Oui, l'argument peut être lu comme pour (initialiser i à partir de 1; tant que i est inférieur ou égal à 1; augmenter i de 1) {faire des choses de manière itérative}
Osman Mamun
1

Créez plusieurs répertoires sous le répertoire actuel:

mkdir ('abc','def','jkl') 

Ce qui précède est une version abrégée des éléments suivants. Remarquez le signe at inclus devant le tableau de chaînes et l'utilisation de paramètres nommés:

mkdir -Path @('abc','def','jkl')

Et si vous voulez aller jusqu'au bout, la commande native complète serait:

New-Item -Path @('abc','def','jkl') -ItemType Directory

Lorsque j'utilise la ligne de commande PowerShell, j'utilise la version courte.

Lors de l'écriture d'un script, en particulier un pour les autres (qui pourraient être nouveaux dans PowerShell), j'ai tendance à écrire la commande native complète.

Choisissez ce qui vous convient le mieux.

fpm
la source