Mehrere Verzeichnisse: Powershell-Äquivalent zu "mkdir dir {1..9}"?

11

Was ist die Syntax mehr Verzeichnisse erstellen mit PowerShells md (oder mkdir, New-Item ...) entspricht den ‚nichts Befehl mkdir ch{1..9}dh

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

Ich habe in den Manpages und in der Hilfe nach Beispielen gesucht, aber ich kenne die Syntax für PowerShell nicht, um so eine einfache Sache zu tun. Vielen Dank.

Mr. Kennedy
quelle

Antworten:

16

Wie lautet die Syntax zum Erstellen mehrerer Verzeichnisse mit PowerShell?

Verwenden Sie den folgenden Befehl:

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

Wie es funktioniert:

  • 0..9Der Bereichsoperator .. generiert die Folge von Zahlen 0, 1, ... 9
  • die Zahlen sind pipelined | auf den nächsten Befehl
  • foreach Schleifen (nacheinander durch jede Nummer)
  • { ... }ist ein Skriptblock
  • New-Item -ItemType directory -Name $("ch" + $_) erstellt die Verzeichnisse
  • $_ist eine automatische Variable , die das aktuelle Objekt in der Pipeline darstellt (die Nummer)

Beispiel:

> 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
quelle
3
Es gibt nichts weniger Ausführliches als Folgendes einzugeben : 1..9 | % $_{ md -name $("ch" + $_) }?
Mr. Kennedy
1
Ich glaube schon. Aber ich bin kein PowerShell-Experte.
DavidPostill
1
Es sieht in Ordnung aus, aber ich schlage vor, Sie versuchen es und sehen :)
DavidPostill
1
a-HA - bekam es 1..9 | % $_{ mv ch$_*.* ch$_ }
Mr. Kennedy
1
@ Mr.Kennedy Paar Dinge. Sie sollten versuchen, das auszuführen git addund zu sehen, was es zurückgibt. Beachten Sie, dass $_in einem foreach nur jeder einzelne Array-Eintrag des letzten Pipeline-Elements enthalten ist (was bedeutet, dass der commitSchritt in Ihrem Beispiel keine Rohzahlen erhält, sodass das cherneute Hinzufügen wahrscheinlich falsch ist ). In Ihrem Beispiel werden die Commits erst (?) Ausgeführt, nachdem alle Adds abgeschlossen sind. Dies bedeutet, dass das erste Commit alles erhält ... Alternativ können Sie mehrere Anweisungen (getrennt durch ;) in einem einzelnen foreach-Schritt verwenden.
Bob
22

Sie müssen mkdir nicht mehrmals aufrufen, da New-Itemes eine Reihe von Pfaden annehmen kann. Beispielsweise:

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

@ DavidPostill hat die meisten Konzepte in seiner Antwort erklärt . Dies nutzt auch die String-Interpolation, anstatt eine explizite Verkettung durchzuführen. Zusätzlich wird die %Kurzschrift anstelle von verwendet ForEach-Object, hat aber dieselbe Bedeutung.

Leider scheint es keine einfache Möglichkeit zu geben, einen String wie in bash in ein Array von Strings zu interpolieren.

Bob
quelle
2
@ DavidPostill Sie haben viel ausführlicher als ich erklärt. Dies könnte eher ein Nachtrag zu Ihrer Antwort sein: P
Bob
2
@ DavidPostill bitte nicht löschen - Ihre Erklärung ist sehr nützlich
Mr. Kennedy
3
Maximal Golfversion:md(0..9|%{"ch$_"})
Ben N
2
@DavidPostill mdist ein Standardalias für mkdireine PowerShell-Funktion. %ist, wie Bob erwähnte, ein Standard-Alias ​​für ForEach-Object. Zeichenfolgen in doppelten Anführungszeichen interpolieren Variablen und "ch$_"entsprechen daher 'ch' + $_. Sie können einen Alias ​​nachschlagen, indem Sie Get-Command( gcm) darauf ausführen.
Ben N
1
@ Mr.Kennedy So ​​etwas wie: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}oder 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Diese Kommentare werden jetzt etwas lang. Wenn Sie also weitere Fragen haben, stellen Sie diese bitte als Fragen oder gehen Sie in den Chat.
Bob
1

Ich würde für die Schleifenversion verwenden, da es leicht zu merken ist und auf viele Situationen angewendet werden kann. Sogar es kann für mehrere Befehle verwendet werden.

Für ein Äquivalent dieses Bash-Befehls:

für i in {1..9}; do
mkdir ch $ i
done

... in PowerShell verwenden:

for($i=1;
$i -le 10;
$i++)
{md ch$i}
Osman Mamun
quelle
mamum, könnten Sie das klarstellen? Ich erhalte eine Fehlermeldung, wenn ich Ihren Code über die PowerShell-Befehlszeile ausführe, oder als ps1-Skript: Missing opening '(' after keyword 'for'.Dieser Befehl: foreach ($i in 1..9) {md ch$i}Ermittelt mir nummerierte "ch" -Apter-Verzeichnisse, aber ich verstehe Ihr "für" nicht. ..; do ... done "Schleife.
Mr. Kennedy
Die hier verwendete for-Schleife ist für die Bash-Shell (/ bin / sh). Ich ändere meine Shell immer auf Bash, da ich an diese Shell gewöhnt bin. Für ps müssen Sie eine andere Syntax für die for-Schleife verwenden (siehe den beigefügten Link ss64.com/ps/for.html )
Osman Mamun
1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}danke mamun, aber ich bin noch nicht "Bourne again ...";) (noch kenne ich C ++, aber ich glaube ich verstehe irgendwie was "$ i-le" (wenn kleiner oder gleich?) Und "$ i ++" (~ "i + = 1"?) bedeuten und tun im Befehl ...
Mr. Kennedy
1
Ja, das Argument kann gelesen werden für (initialisiere i von 1; solange i kleiner oder gleich 1 ist; erhöhe i um 1) {mache Sachen iterativ}
Osman Mamun
1

Erstellen Sie mehrere Verzeichnisse unter dem aktuellen Verzeichnis:

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

Das Obige ist eine Kurzversion des Folgenden. Beachten Sie das at-Zeichen vor dem Array von Zeichenfolgen und die Verwendung benannter Parameter:

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

Und wenn Sie den ganzen Weg gehen möchten, wäre der vollständige native Befehl:

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

Bei Verwendung der PowerShell-Befehlszeile verwende ich die Kurzversion.

Wenn ich ein Skript schreibe, insbesondere eines für andere (die möglicherweise neu in PowerShell sind), schreibe ich normalerweise den vollständigen nativen Befehl.

Wählen Sie, was für Sie am besten funktioniert.

fpm
quelle