Mehrere Verzeichnisse: Powershell-Äquivalent zu "mkdir dir "?

2604
Mr. Kennedy

Wie lautet die Syntax zum Erstellen mehrerer Verzeichnisse mit PowerShells md (oder mkdir, New-Item ...), die dem Befehl 'nix entsprechen, mkdir chdh

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

Ich habe in den Manpages und in get-help nach Beispielen gesucht, aber ich weiß nicht, wie PowerShell so einfach funktioniert. Vielen Dank.

11

3 Antworten auf die Frage

22
Bob

Sie müssen mkdir nicht mehrmals aufrufen, da New-Itemein Array von Pfaden verwendet werden kann. Zum Beispiel:

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

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

Leider scheint es keine einfache Möglichkeit zu geben, eine Zeichenfolge in ein String-Array zu interpolieren, wie in bash.

Oh. Eine viel einfachere Lösung. Soll ich meine Anfängeranstrengung löschen? DavidPostill vor 7 Jahren 0
@DavidPostill Sie haben weitaus detaillierter als ich erklärt. Dies könnte eher ein Nachtrag zu Ihrer Antwort sein: P Bob vor 7 Jahren 2
@DavidPostill bitte nicht löschen - Ihre Erklärung ist sehr nützlich Mr. Kennedy vor 7 Jahren 2
Bob, ein hervorragender Punkt, wenn Sie mkdir nur einmal mit dieser Syntax aufrufen. Mr. Kennedy vor 7 Jahren 0
Maximal eingespielte Version: `md (0..9 |% {" ch $ _ "})` Ben N vor 7 Jahren 3
@ BenN s / golf / obfuscat / :) Ich brauche dafür einen Übersetzer. Gibt es etwas, das hin und her übersetzt? DavidPostill vor 7 Jahren 0
@DavidPostill `md` ist ein Standardalias für` mkdir`, eine PowerShell-Funktion. "%" ist, wie Bob erwähnt hat, ein Standardalias für "ForEach-Object". Strings in doppelten Anführungszeichen interpolieren Variablen, so dass "ch $ _" `äquivalent zu" ch "+ $ _ ist. Sie können einen Alias ​​nachschlagen, indem Sie "Get-Command" ("gcm") darauf ausführen. Ben N vor 7 Jahren 2
Bob und @BenN, mit dieser Syntax, wie man entsprechende ch # .files in ch # / Verzeichnisse verschiebt? Diese (und ähnliche Beschwörungen) schlagen fehl: `mv $ (1..9 |% {" ch $ _ *. * "} {" Ch $ _ "})` Mr. Kennedy vor 7 Jahren 0
Ahh ... habe es verstanden: `mv $ (1..9 |% {" ch $ _ *. * Ch $ _ "})` Mr. Kennedy vor 7 Jahren 0
Guter Punkt! Irgendeine Idee, wie man git-Befehle zum Hinzufügen und Festschreiben an diese Ordner weiterleitet, so dass jeder entsprechende Satz seine Aktualisierungskommentare mit entsprechenden # hat? Mr. Kennedy vor 7 Jahren 0
@ Mr.Kennedy ... Bist du sicher, dass das funktioniert? Ich glaube nicht, dass ein Umzug mehrere Ziele auf einmal in Anspruch nehmen kann. Sie müssen also eine Pipeline wählen, wie in Davids Antwort für einen Umzug. Denken Sie daran, dass "ch1 *. *" Auch "ch11.txt" fängt ... Bob vor 7 Jahren 0
Bob, Whoops - Sie haben Recht, Sir! Mein Fehler! Mr. Kennedy vor 7 Jahren 0
@ Mr.Kennedy Etwas wie: `1..9 | % {"ch $ _"} | % `oder` 1..9 | % {$ name = "ch $ _"; git add "$ name"; git commit -m "$ name"} `. Diese Kommentare werden jetzt etwas länger. Wenn Sie weitere Fragen haben, stellen Sie sie bitte als Fragen oder gehen Sie in den Chat. Bob vor 7 Jahren 1
16
DavidPostill

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:

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 
Es gibt nichts weniger Verbales als die Eingabe des folgenden Befehls: 1..9 | % $ _ `? Mr. Kennedy vor 7 Jahren 3
Ich glaube schon. Aber ich bin kein PowerShell-Experte. DavidPostill vor 7 Jahren 1
Ha - ich auch nicht! ... als Folgemaßnahme dazu, wenn das übergeordnete Verzeichnis voller Dateien mit vorangestellten ch # s wäre, würde 1..9 | % $ _ `alle ch # .ext-Dateien in die entsprechenden ch # / -Verzeichnisse einfügen? Mr. Kennedy vor 7 Jahren 0
Es sieht okay aus, aber ich schlage vor, Sie versuchen es und sehen :) DavidPostill vor 7 Jahren 1
Oh, ich habe natürlich verschiedene Inkatationen ausprobiert: \ Mr. Kennedy vor 7 Jahren 0
a-HA - bekam es: `1..9 | % $ _ `: ^ D Mr. Kennedy vor 7 Jahren 1
YaY - `git add` hat funktioniert:` 1..9 | % $ _ `... aber das:` 1..9 | % $ _ `wird einige Überlegungen erfordern ... Nochmals vielen Dank, IRL, Sie haben jederzeit eine Tasse Kaffee bei mir! Mr. Kennedy vor 7 Jahren 0
Ich habe der Antwort einige Erklärungen hinzugefügt (wie es funktioniert). DavidPostill vor 7 Jahren 0
Sehr nützliche Erklärung. Würde in diesem fortgesetzten Fall diese neuen Verzeichnisse übernommen und die Dateien in ein Github-Repository verschoben werden, würde dieses lange Piping Dateien hinzufügen und festschreiben, so dass jedes ch # -Ord und die entsprechenden Dateien einen entsprechenden ch # -Updatekommentar haben. "1..9 | % $ _ | % $ _ ` Mr. Kennedy vor 7 Jahren 0
Ich weiß es nicht. Ich bin noch ein Anfänger in der PowerShell. Ich musste die Dinge nachschlagen, um deine Frage zu beantworten;) DavidPostill vor 7 Jahren 0
K - wenn ich herausfinde wie, dann werde ich eine Lösung posten, danke !!! Mr. Kennedy vor 7 Jahren 0
@ Mr.Kennedy Paar Dinge. Sie sollten versuchen, 'git add' auszuführen und zu sehen, was es zurückgibt. Denken Sie daran, dass '$ _' in einem foreach nur jeder einzelne Array-Eintrag des letzten Pipeline-Elements ist (was den `Commit'-Schritt in Ihrem Beispiel bedeutet). Es werden keine rohen Zahlen angezeigt, das Hinzufügen von "ch" ist wahrscheinlich falsch). In Ihrem Beispiel würden die Commits nur (?) Ausgeführt, nachdem alle Additionen ausgeführt wurden. Das bedeutet, dass beim ersten Commit alles erhalten würde. Alternativ können Sie auch mehrere Anweisungen (durch `;` getrennt) in einem einzigen foreach-Schritt verwenden . Bob vor 7 Jahren 1
Danke - Ihre Erkenntnisse sind sehr hilfreich und ja - alles wurde als Update-Kommentar mit "ch1" versehen. Mr. Kennedy vor 7 Jahren 0
Ich füge eine etwas prägnantere Alternative hinzu: 1..9 | mkdir -Name {"ch $ _"} OldFart vor 7 Jahren 0
1
mamun

Ich würde für die Schleifenversion verwenden, da sie 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 ; mach
mkdir ch $ ich habe
getan

... in PowerShell verwenden:

for($i=1; $i -le 10; $i++)  
Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Mamum, könntest du das erklären? Ich bekomme eine Fehlermeldung, wenn ich deinen Code von der PowerShell - Befehlszeile aus ausführte, oder als ps1 - Skript: "Missing opening" ("after keyword" für "") 1..9) `ruft mir nummerierte" ch "-Paperverzeichnisse auf, aber ich verstehe Ihre" for ...; do ... done "-Schleife nicht. Mr. Kennedy vor 7 Jahren 0
Die for-Schleife, die ich hier verwendet habe, ist für die Bash-Shell (/ bin / sh). Ich ändere meine Shell immer in Bash, da ich an diese Shell gewöhnt bin. Für ps müssen Sie eine andere Syntax für for-Schleife verwenden (siehe den beigefügten Link http://ss64.com/ps/for.html). mamun vor 7 Jahren 0
PowerShell: `for ($ i = 1; $ i -le 10; $ i ++) ` danke mamun, aber ich bin noch nicht "Bourne again ...";) (noch kenne ich C ++ , aber ich glaube, ich verstehe, was "$ i-le" (wenn kleiner oder gleich?) und "$ i ++" (~ "i + = 1"?) bedeuten und im Befehl ausführen ... Mr. Kennedy vor 7 Jahren 1
Ja, das Argument kann gelesen werden als (initialisieren Sie i von 1; so lange i kleiner oder gleich 1 ist; erhöhen Sie i um 1) mamun vor 7 Jahren 1