Birden çok dizin: Powershell eşdeğeri “mkdir dir {1..9}”?


11

'Nix komutuna eşdeğer PowerShells md (veya mkdir, New-Item ...) ile birden çok dizin oluşturma sözdizimi nedir mkdir ch{1..9}ie

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

Man sayfalarına baktım ve örnekler için yardım aldım, ancak PowerShell'in sözdizimini bu kadar basit bir şey yapmak için bilmiyorum. Teşekkür ederim.

Yanıtlar:


16

PowerShell ile birden çok dizin oluşturmak için sözdizimi nedir

Aşağıdaki komutu kullanın:

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

Nasıl çalışır:

Misal:

> 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
Hiçbir şey aşağıdaki girerken daha az ayrıntılı yoktur: 1..9 | % $_{ md -name $("ch" + $_) }?
Bay Kennedy

1
Sanırım. Ama ben PowerShell uzmanı değilim.
DavidPostill

1
Tamam görünüyor, ama denemenizi ve görmenizi öneririm :)
DavidPostill

1
a-HA - anladım 1..9 | % $_{ mv ch$_*.* ch$_ }:: ^ D
Bay Kennedy

1
@ Mr.Kennedy Çift şeyler. Çalıştırmayı denemeli git addve ne döndürdüğünü görmelisiniz - $_bir foreach'in içinde, son ardışık düzen öğesinin yalnızca her bir dizi girişi olduğunu unutmayın (bu commit, örneğinizdeki adımın ham sayıları alamayacağı anlamına gelir , bu nedenle chtekrar eklemek muhtemelen yanlıştır ). Ayrıca, örneğinizde, taahhütler yalnızca (?) Tüm eklemeler yapıldıktan sonra çalışır, bu da ilk ;işlemin her şeyi alacağı anlamına gelir ... Alternatif olarak, tek bir foreach adımı içinde birden çok ifade (birbirinden ayrılarak ) kullanabilirsiniz .
Bob

22

New-ItemBir dizi yolu alabileceğinden mkdir'i birden çok kez çağırmanız gerekmez . Örneğin:

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

@DavidPostill kavramları çoğu anlattı onun cevabını . Bu , açık bir birleştirme yapmak yerine dize enterpolasyonundan da yararlanır . Ayrıca, %steno yerine kullanılır ForEach-Object, ancak aynı anlama sahiptir.

Ne yazık ki, bir dizgeyi bash'ta olduğu gibi bir dizgi dizisine enterpole etmenin kolay bir yolu yoktur.


2
@DavidPostill I'den çok daha ayrıntılı bir şekilde açıkladınız. Bu, cevabınıza bir ek olabilir: P
Bob

2
@DavidPostill lütfen silmeyin - açıklamanız çok yararlı
Bay Kennedy

3
Maksimum golf versiyonu:md(0..9|%{"ch$_"})
Ben N

2
@DavidPostill bir PowerShell işlevi olan mdstandart bir diğer addır mkdir. %, Bob'un belirttiği gibi, için standart bir takma addır ForEach-Object. Çift tırnaklı dizeler enterpolate değişkenler, yani "ch$_"eşdeğerdir 'ch' + $_. Üzerinde bir Get-Command( gcm) çalıştırarak bir takma ad arayabilirsiniz .
Ben N

1
@ Mr.Kennedy Şuna benzer bir şey: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}veya 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Bu yorumlar şimdi biraz uzun sürüyor, bu yüzden başka sorularınız varsa - lütfen soru olarak sorun veya belki sohbete bırakın.
Bob

1

Hatırlanması kolay ve birçok duruma uygulanabilen döngü sürümü için kullanırım. Birden fazla komut için bile kullanılabilir.

Bu bash komutunun eşdeğeri için:

{1..9} içindeki i için; do
i mkdir ch $
yapılır

... PowerShell kullanımında:

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

mamum, açıklığa kavuşturabilir misiniz? - PowerShell komut satırından veya ps1 komut dosyası olarak kodunuzu çalıştırdığımda bir hata alıyorum: Missing opening '(' after keyword 'for'.Bu komut: foreach ($i in 1..9) {md ch$i}"ch" apter dizinlerini numaralandırıyor, ama sizin için "anlamıyorum. ..; do ... done "döngüsü.
Bay Kennedy

Burada kullandığım for döngüsü bash kabuğu (/ bin / sh) içindir. Bu kabuğa alışkın olduğum için her zaman kabuğumu bash olarak değiştiririm. PS için, döngü için farklı sözdizimi kullanmanız gerekir (lütfen ekli bağlantıya bakın ss64.com/ps/for.html )
Osman Mamun

1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}teşekkürler mamun, ama henüz "Bourne tekrar değilim ...";) (ne C ++ bilmiyorum, ama sanırım ne "$ i-le" (daha küçük veya eşit?) Ve "$ i ++" (~ "i + = 1"?) anlamı ve emrinde çalışıyorlar ...
Bay Kennedy

1
Evet, argüman şu şekilde okunabilir (i'yi 1'den başlat; i 1'den küçük veya 1'e eşit olduğu sürece; i'yi 1 arttırır) {yinelemeli şeyler yapın}
Osman Mamun

1

Geçerli dizinin altında birden çok dizin oluşturun:

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

Yukarıdakiler kısa süreli bir versiyonudur. Dizeler dizisinin önünde bulunan at-sign ve adlandırılmış parametrelerin kullanımına dikkat edin:

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

Ve sonuna kadar gitmek isterseniz, tam yerel komut şöyle olacaktır:

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

PowerShell komut satırını kullanırken, kısa sürümü kullanıyorum.

Bir komut dosyası yazarken, özellikle diğerleri için (PowerShell'de yeni olabilecek), tam yerel komutu yazma eğilimindeyim.

Sizin için en uygun olanı seçin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.