Beberapa direktori: Powershell setara dengan "mkdir dir {1..9}"?

11

Apa sintaks untuk membuat beberapa direktori dengan PowerShells md (atau mkdir, New-Item ...) setara dengan perintah 'nix mkdir ch{1..9}yaitu

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

Saya telah melihat halaman manual dan mendapatkan bantuan untuk contoh, tapi saya tidak tahu sintaks untuk PowerShell untuk melakukan hal yang begitu sederhana. Terima kasih.

Tuan Kennedy
sumber

Jawaban:

16

Apa itu sintaks untuk membuat banyak direktori dengan PowerShell

Gunakan perintah berikut:

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

Bagaimana itu bekerja:

  • 0..9yang Operator kisaran .. menghasilkan urutan angka 0, 1, ... 9
  • angka-angka di pipelined | ke perintah berikutnya
  • foreach loop (melalui setiap nomor pada gilirannya)
  • { ... }adalah blok skrip
  • New-Item -ItemType directory -Name $("ch" + $_) membuat direktori
  • $_adalah variabel otomatis yang mewakili objek saat ini dalam pipa (angka)

Contoh:

> 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
sumber
3
Tidak ada yang kurang dari memasukkan kata-kata berikut 1..9 | % $_{ md -name $("ch" + $_) }:?
Tuan Kennedy
1
Aku pikir begitu. Tapi saya bukan ahli PowerShell.
DavidPostill
1
Kelihatannya oke, tapi saya sarankan Anda mencobanya dan lihat :)
DavidPostill
1
a-HA - mengerti 1..9 | % $_{ mv ch$_*.* ch$_ }:: D
Tuan Kennedy
1
@ Hal Mr.Kennedy Pasangan. Anda harus mencoba menjalankan git adddan melihat apa yang dikembalikan - perlu diingat bahwa $_di dalam foreach hanya setiap entri array individu dari item pipa terakhir (yang berarti commitlangkah dalam contoh Anda tidak akan mendapatkan angka mentah, jadi menambahkan chlagi mungkin salah ). Juga, dalam contoh Anda, komit hanya akan (?) Berjalan setelah semua penambahan dilakukan, yang berarti komit pertama akan mendapatkan segalanya ... Atau, Anda dapat menggunakan beberapa pernyataan (dipisahkan oleh ;) di dalam satu langkah foreach tunggal.
Bob
22

Anda tidak perlu memanggil mkdir beberapa kali, karena New-Itemdapat mengambil lintasan lintasan. Sebagai contoh:

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

@DavidPostill telah menjelaskan sebagian besar konsep dalam jawabannya . Ini juga mengambil keuntungan dari interpolasi string daripada melakukan penggabungan eksplisit. Selain itu, %singkatan digunakan sebagai pengganti ForEach-Object, tetapi memiliki arti yang sama.

Sayangnya, tampaknya tidak ada cara mudah untuk menginterpolasi string ke dalam array string seperti dalam bash.

Bob
sumber
2
@DavidPostill Anda telah menjelaskan lebih detail daripada saya. Ini mungkin lebih merupakan tambahan dari jawaban Anda: P
Bob
2
@DavidPostill tolong jangan hapus itu - penjelasan Anda sangat berguna
Tuan Kennedy
3
Versi golf maksimal:md(0..9|%{"ch$_"})
Ben N
2
@ Davidvider mdadalah alias standar untuk mkdir, yang merupakan fungsi PowerShell. %, seperti yang disebutkan Bob, adalah alias standar untuk ForEach-Object. String kutip ganda variabel interpolasi, jadi "ch$_"sama dengan 'ch' + $_. Anda dapat mencari alias dengan menjalankan Get-Command( gcm) di atasnya.
Ben N
1
@ Mr.Kennedy Sesuatu seperti: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}atau 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Komentar-komentar ini agak lama sekarang, jadi jika Anda memiliki pertanyaan lebih lanjut - silakan tanyakan sebagai pertanyaan, atau mungkin mengobrol.
Bob
1

Saya akan menggunakan untuk versi loop karena mudah diingat dan dapat diterapkan pada banyak situasi. Bahkan bisa digunakan untuk banyak perintah.

Untuk setara dengan perintah bash ini:

untuk saya di {1..9}; lakukan
mkdir ch $ i
selesai

... dalam penggunaan PowerShell:

for($i=1;
$i -le 10;
$i++)
{md ch$i}
Osman Mamun
sumber
mamum, bisakah Anda mengklarifikasi - Saya mendapatkan kesalahan ketika saya menjalankan kode Anda dari baris perintah PowerShell, atau, sebagai skrip ps1: Missing opening '(' after keyword 'for'.Perintah ini: foreach ($i in 1..9) {md ch$i}memberi saya nomor direktori direktori "ch", tetapi saya tidak mengerti "untuk" Anda. ..; do ... done "loop.
Tuan Kennedy
Untuk loop yang saya gunakan di sini adalah untuk bash shell (/ bin / sh). Saya selalu mengganti shell saya menjadi bash karena saya terbiasa dengan shell ini. Untuk ps, Anda harus menggunakan sintaks yang berbeda untuk for loop (silakan lihat tautan terlampir ss64.com/ps/for.html )
Osman Mamun
1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}terima kasih mamun, tapi saya belum "Bourne lagi ...";) (saya juga tidak tahu C ++, tapi saya pikir saya agak mengerti apa "$ i-le" (jika kurang dari atau sama dengan?) Dan "$ i ++" (~ "i + = 1"?) berarti dan melakukan dalam perintah ...
Tuan Kennedy
1
Ya, argumen dapat dibaca sebagai (inisialisasi saya dari 1; selama saya kurang dari atau sama dengan 1; naikkan saya dengan 1) {lakukan hal-hal berulang}}
Osman Mamun
1

Buat beberapa direktori di bawah direktori saat ini:

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

Di atas adalah versi singkat dari yang berikut ini. Perhatikan tanda-at yang disertakan di depan array string dan penggunaan parameter bernama:

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

Dan jika Anda ingin melanjutkan, perintah asli penuh adalah:

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

Saat menggunakan baris perintah PowerShell, saya menggunakan versi singkat.

Saat menulis skrip, terutama skrip untuk orang lain (yang mungkin baru di PowerShell), saya cenderung menulis perintah asli penuh.

Pilih apa pun yang paling cocok untuk Anda.

fpm
sumber