Wiele katalogów: ekwiwalent PowerShell „mkdir dir {1..9}”?


11

Jaka jest składnia do tworzenia wielu katalogów za pomocą PowerShells md (lub mkdir, New-Item ...) odpowiednik polecenia 'nix mkdir ch{1..9} to znaczy

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

Zajrzałem do stron man i get-help na przykładach, ale nie znam składni PowerShell, aby zrobić tak prostą rzecz. Dziękuję Ci.

Odpowiedzi:


16

Jaka jest składnia do tworzenia wielu katalogów za pomocą PowerShell

Użyj następującego polecenia:

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

Jak to działa:

Przykład:

> 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
Nie ma nic mniej szczegółowego niż wpisanie: 1..9 | % $_{ md -name $("ch" + $_) } ?
Mr. Kennedy

1
Chyba tak. Ale nie jestem ekspertem od PowerShell.
DavidPostill

1
Wygląda dobrze, ale proponuję spróbować i zobaczyć :)
DavidPostill

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

1
@ Mr.Kennedy Couple things. Powinieneś spróbować uruchomić git add i zobacz, co wróci - pamiętaj o tym $_ wewnątrz foreach jest tylko każdy indywidualny wpis tablicy ostatniego elementu potoku (co oznacza commit krok w twoim przykładzie nie dostanie surowych liczb, więc dodanie ch znowu prawdopodobnie jest źle). Ponadto, w twoim przykładzie, zatwierdzenia będą tylko (?) Uruchamiane po wykonaniu wszystkich dodatków, co oznacza, że ​​pierwsze zatwierdzenie otrzyma wszystko ... Alternatywnie, możesz użyć wielu instrukcji (rozdzielonych przez ; ) w jednym kroku foreach.
Bob

22

Nie musisz wielokrotnie wywoływać mkdir, ponieważ New-Item może wziąć szereg ścieżek. Na przykład:

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

@DavidPostill wyjaśnił większość pojęć w jego odpowiedź . To także wykorzystuje interpolacja napisów zamiast wykonywania jawnej konkatenacji. Dodatkowo % skrót jest używany zamiast ForEach-Object, ale ma to samo znaczenie.

Niestety, nie ma łatwego sposobu na interpolowanie ciągu znaków do tablicy ciągów, jak w bashu.


2
@DavidPostill Wyjaśniłeś o wiele bardziej szczegółowo niż I. Może to być raczej uzupełnienie twojej odpowiedzi: P
Bob

2
@DavidPostill nie usuwaj go - Twoje wyjaśnienie jest bardzo przydatne
Mr. Kennedy

3
Wersja Maximally Golfed: md(0..9|%{"ch$_"})
Ben N

2
@DavidPostill md to standardowy alias dla mkdir, która jest funkcją PowerShell. %, jak wspomniał Bob, to standardowy alias dla ForEach-Object. Podwójnie cytowane łańcuchy interpolują zmienne, więc "ch$_" jest równa 'ch' + $_. Możesz wyszukać alias, uruchamiając Get-Command ( gcm ) na tym.
Ben N

1
@ Mr.Kennedy Coś w stylu: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"} lub 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Te komentarze są teraz nieco dłuższe, więc jeśli masz dalsze pytania - zadaj je jako pytania, a może wpadnij na czat.
Bob

1

Używałbym wersji pętli, ponieważ jest łatwa do zapamiętania i może być stosowana w wielu sytuacjach. Nawet można go użyć do wielokrotnego polecenia.

Dla odpowiednika tego polecenia bash:

dla i w {1..9}; robić
mkdir ch $ i
Gotowe

... w użyciu PowerShell:

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

mamum, czy możesz wyjaśnić - pojawia się błąd, gdy uruchamiam twój kod z linii poleceń PowerShell, lub, jako skrypt ps1: Missing opening '(' after keyword 'for'. To polecenie: foreach ($i in 1..9) {md ch$i} pobiera mi numerowane katalogi „ch”, ale nie rozumiem twojej pętli „for ...; do ... done”.
Mr. Kennedy

Użyta tutaj pętla for jest przeznaczona dla powłoki bash (/ bin / sh). Zawsze zmieniam swoją powłokę, aby bash, jak jestem przyzwyczajony do tej powłoki. Dla ps musisz użyć innej składni dla pętli for (zobacz załączony link ss64.com/ps/for.html )
mamun

1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i} dzięki mamun, ale jeszcze nie jestem "Bourne ponownie ...";) (ani nie znam C ++, ale myślę, że rozumiem, co "$ i-le" (jeśli jest mniejsze lub równe?) i "$ i ++ "(~" i + = 1 "?) oznacza i robi w poleceniu ...
Mr. Kennedy

1
Tak, argument ca może być odczytywany jak dla (zainicjuj i od 1; tak długo jak i jest mniejszy lub równy 1; zwiększ i przez 1) {rób rzeczy iteracyjnie}
mamun
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.