Nhiều thư mục: Powershell tương đương với thư mục mkdir dir {1..9}?


11

Cú pháp để tạo nhiều thư mục với PowerShells md (hoặc mkdir, New-Item ...) tương đương với lệnh 'nix mkdir ch{1..9}tức là

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

Tôi đã xem các trang hướng dẫn và nhận trợ giúp chẳng hạn, nhưng tôi không biết cú pháp để PowerShell thực hiện một việc đơn giản như vậy. Cảm ơn bạn.

Câu trả lời:


16

Cú pháp để tạo nhiều thư mục với PowerShell là gì

Sử dụng lệnh sau:

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

Làm thế nào nó hoạt động:

Thí dụ:

> 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
Không có gì ít dài dòng hơn là nhập vào sau : 1..9 | % $_{ md -name $("ch" + $_) }?
Ông Kennedy

1
Tôi nghĩ vậy. Nhưng tôi không phải là chuyên gia PowerShell.
DavidPostill

1
Có vẻ ổn, nhưng tôi khuyên bạn nên dùng thử và xem :)
DavidPostill

1
a-HA - hiểu rồi 1..9 | % $_{ mv ch$_*.* ch$_ }:: ^ D
Ông Kennedy

1
@ Mr.Kennedy Vài điều. Bạn nên thử chạy git addvà xem những gì nó trả về - hãy nhớ rằng $_bên trong một foreach chỉ là mỗi mục nhập mảng riêng lẻ của mục đường ống cuối cùng (có nghĩa là commitbước trong ví dụ của bạn sẽ không nhận được số nguyên, vì vậy việc thêm chlại có thể sai ). Ngoài ra, trong ví dụ của bạn, các xác nhận sẽ chỉ chạy (?) Sau khi tất cả các lần thêm được thực hiện, điều đó có nghĩa là lần xác nhận đầu tiên sẽ nhận được mọi thứ ... Ngoài ra, bạn có thể sử dụng nhiều câu lệnh (cách nhau ;) trong một bước foreach duy nhất.
Bob

22

Bạn không cần phải gọi mkdir nhiều lần, bởi vì New-Itemcó thể mất một loạt các đường dẫn. Ví dụ:

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

@DavidPostill đã giải thích hầu hết các khái niệm trong câu trả lời của mình . Điều này cũng tận dụng phép nội suy chuỗi thay vì thực hiện nối ghép rõ ràng. Ngoài ra, tốc %ký được sử dụng thay thế ForEach-Object, nhưng có cùng ý nghĩa.

Thật không may, dường như không phải là một cách dễ dàng để nội suy một chuỗi thành một chuỗi các chuỗi như trong bash.


2
@DavidPostill Bạn đã giải thích chi tiết hơn nhiều so với I. Đây có thể là phần phụ lục cho câu trả lời của bạn: P
Bob

2
@DavidPostill xin vui lòng không xóa nó - lời giải thích của bạn rất hữu ích
Ông Kennedy

3
Phiên bản chơi gôn tối đa:md(0..9|%{"ch$_"})
Ben N

2
@DavidPostill mdlà một bí danh tiêu chuẩn cho mkdir, đó là chức năng PowerShell. %, như Bob đã đề cập, là một bí danh tiêu chuẩn cho ForEach-Object. Chuỗi trích dẫn kép nội suy các biến, do đó, "ch$_"tương đương với 'ch' + $_. Bạn có thể tra cứu bí danh bằng cách chạy Get-Command( gcm) trên đó.
Ben N

1
@ Mr.Kennedy Một cái gì đó như: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}hoặc 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Những bình luận này hiện đang hơi lâu, vì vậy nếu bạn có thêm câu hỏi - vui lòng hỏi chúng dưới dạng câu hỏi hoặc có thể thả vào trò chuyện.
Bob

1

Tôi sẽ sử dụng cho phiên bản vòng lặp vì nó dễ nhớ và có thể được áp dụng cho nhiều tình huống. Thậm chí nó có thể được sử dụng cho nhiều lệnh.

Đối với một tương đương của lệnh bash này:

cho tôi trong {1..9}; làm
mkdir ch $ tôi đã
làm xong

... trong PowerShell sử dụng:

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

mamum, bạn có thể làm rõ - tôi gặp lỗi khi chạy mã của bạn từ dòng lệnh PowerShell, hoặc, dưới dạng tập lệnh ps1: Missing opening '(' after keyword 'for'.Lệnh này: foreach ($i in 1..9) {md ch$i}giúp tôi đánh số các thư mục apter "ch", nhưng tôi không hiểu "của bạn. ..; làm ... xong "vòng lặp.
Ông Kennedy

Vòng lặp for tôi sử dụng ở đây là cho bash shell (/ bin / sh). Tôi luôn thay đổi vỏ của mình thành bash vì tôi đã quen với vỏ này. Đối với ps, bạn phải sử dụng cú pháp khác nhau cho vòng lặp (vui lòng xem liên kết đính kèm ss64.com/ps/for.html )
Osman Mamun

1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}cảm ơn mamun, nhưng tôi chưa "Bourne lần nữa ...";) (tôi cũng không biết C ++, nhưng tôi nghĩ tôi sắp xếp hiểu "$ i-le" (nếu nhỏ hơn hoặc bằng?) Và "$ i ++" (~ "i + = 1"?) Có nghĩa là và đang thực hiện lệnh ...
Ông Kennedy

1
Có, đối số ca được đọc như đối với (khởi tạo i từ 1; miễn là tôi nhỏ hơn hoặc bằng 1; tăng i lên 1) {làm công cụ lặp lại}
Osman Mamun

1

Tạo nhiều thư mục bên dưới thư mục hiện tại:

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

Trên đây là một phiên bản ngắn của sau đây. Lưu ý dấu hiệu bao gồm phía trước mảng chuỗi và việc sử dụng các tham số được đặt tên:

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

Và nếu bạn muốn đi hết con đường, lệnh gốc đầy đủ sẽ là:

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

Khi sử dụng dòng lệnh PowerShell, tôi sử dụng phiên bản ngắn.

Khi viết một tập lệnh, đặc biệt là một tập lệnh cho người khác (có thể là người mới đối với PowerShell), tôi có xu hướng viết toàn bộ lệnh gốc.

Chọn bất cứ điều gì làm việc tốt nhất cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.