Directory multiple: equivalente di Powershell di "mkdir dir {1..9}"?


11

Qual è la sintassi per creare più directory con PowerShells md (o mkdir, New-Item ...) equivalente al comando 'nix mkdir ch{1..9}ie

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

Ho cercato nelle pagine man e ho trovato aiuto per esempi, ma non conosco la sintassi per PowerShell per fare una cosa così semplice. Grazie.

Risposte:


16

Qual è la sintassi per creare più directory con PowerShell

Utilizzare il comando seguente:

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

Come funziona:

Esempio:

> 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

3
Non c'è niente di meno prolisso che inserire quanto segue 1..9 | % $_{ md -name $("ch" + $_) }:?
Mr. Kennedy,

1
Credo di si. Ma non sono un esperto di PowerShell.
DavidPostill

1
Sembra OK, ma ti consiglio di provarlo e vedere :)
DavidPostill

1
a-HA - capito:: 1..9 | % $_{ mv ch$_*.* ch$_ }^ D
Mr. Kennedy,

1
@ Mr.Kennedy Coppia cose. Dovresti provare a eseguire il git adde vedere cosa restituisce - tieni presente che $_all'interno di un foreach c'è solo ogni singola voce dell'array dell'ultimo elemento della pipeline (il che significa che il commitpassaggio nel tuo esempio non otterrà numeri non elaborati, quindi aggiungere di chnuovo probabilmente è sbagliato ). Inoltre, nel tuo esempio, i commit verrebbero eseguiti solo (?) Dopo che tutte le aggiunte sono state completate, il che significa che il primo commit otterrebbe tutto ... In alternativa, potresti usare più istruzioni (separate da ;) all'interno di un singolo passo foreach.
Bob,

22

Non è necessario invocare mkdir più volte, perché New-Itempuò richiedere una serie di percorsi. Per esempio:

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

@DavidPostill ha spiegato la maggior parte dei concetti nella sua risposta . Ciò sfrutta anche l' interpolazione di stringhe anziché eseguire una concatenazione esplicita. Inoltre, %viene utilizzata la scorciatoia anziché ForEach-Object, ma ha lo stesso significato.

Sfortunatamente, non sembra esserci un modo semplice per interpolare una stringa in una matrice di stringhe come in bash.


2
@DavidPostill Hai spiegato in modo molto più dettagliato di I. Questo potrebbe essere più un addendum alla tua risposta: P
Bob,

2
@DavidPostill, per favore, non cancellarlo - la tua spiegazione è molto utile
Mr. Kennedy,

3
Versione per il massimo del golf:md(0..9|%{"ch$_"})
Ben N,

2
@DavidPostill mdè un alias standard per mkdir, che è una funzione di PowerShell. %, come ha detto Bob, è un alias standard per ForEach-Object. Le stringhe tra virgolette interpolano le variabili, quindi "ch$_"è equivalente a 'ch' + $_. Puoi cercare un alias eseguendo Get-Command( gcm) su di esso.
Ben N,

1
@ Mr.Kennedy Qualcosa del tipo: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}o 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Questi commenti stanno diventando un po 'lunghi ora, quindi se hai ulteriori domande, per favore, ponili come domande o magari passa alla chat.
Bob,

1

Vorrei utilizzare per la versione loop in quanto è facile da ricordare e può essere applicato a molte situazioni. Anche può essere usato per più comandi.

Per un equivalente di questo comando bash:

per i in {1..9}; fai
mkdir ch $ ho
fatto

... in PowerShell usare:

for($i=1;
$i -le 10;
$i++)
{md ch$i}

mamma, potresti chiarire - Ottengo un errore quando eseguo il tuo codice dalla riga di comando di PowerShell o, come uno script ps1: Missing opening '(' after keyword 'for'.questo comando: foreach ($i in 1..9) {md ch$i}mi fa numerare le directory apter "ch", ma non capisco il tuo "per. ..; do ... done "loop.
Mr. Kennedy,

Il ciclo for che ho usato qui è per bash shell (/ bin / sh). Cambio sempre la mia shell in bash come sono abituato a questa shell. Per ps, devi usare una sintassi diversa per il ciclo for (consulta il link allegato ss64.com/ps/for.html )
Osman Mamun,

1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}grazie mamun, ma non sono ancora "Bourne again ...";) (né conosco C ++, ma penso di capire cosa "$ i-le" (se inferiore o uguale a?) E "$ i ++" (~ "i + = 1"?) significa e stanno facendo il comando ...
Mr. Kennedy,

1
Sì, l'argomento può essere letto come per (inizializzare i da 1; purché io minore o uguale a 1; aumentare i di 1) {fare cose iterativamente}
Osman Mamun

1

Crea più directory sotto la directory corrente:

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

Quanto sopra è una versione abbreviata di quanto segue. Notare il segno at incluso davanti alla matrice di stringhe e l'uso di parametri denominati:

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

E se vuoi andare fino in fondo, il comando nativo completo sarebbe:

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

Quando utilizzo la riga di comando di PowerShell, utilizzo la versione breve.

Quando scrivo uno script, in particolare uno per gli altri (che potrebbe essere nuovo in PowerShell), tendo a scrivere il comando nativo completo.

Scegli quello che funziona meglio per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.