หลายไดเรกทอรี: Power Pellhell เทียบเท่ากับ“ mkdir dir {1..9}”?


11

ไวยากรณ์ในการสร้างหลายไดเรกทอรีด้วย PowerShells md (หรือ mkdir, รายการใหม่คืออะไร) เทียบเท่ากับคำสั่ง 'nix mkdir ch{1..9}ie

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

ฉันได้ดูหน้า man page และขอความช่วยเหลือเป็นตัวอย่าง แต่ฉันไม่รู้จักไวยากรณ์สำหรับ PowerShell เพื่อทำสิ่งง่าย ๆ ขอบคุณ.

คำตอบ:


16

ไวยากรณ์ในการสร้างหลายไดเรกทอรีด้วย PowerShell คืออะไร

ใช้คำสั่งต่อไปนี้:

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

มันทำงานอย่างไร:

ตัวอย่าง:

> 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
ไม่มีอะไรที่เป็น verbose น้อยกว่าเข้ามาต่อไปนี้: 1..9 | % $_{ md -name $("ch" + $_) }?
นายเคนเนดี้

1
ฉันคิดอย่างนั้น แต่ฉันไม่มีผู้เชี่ยวชาญ PowerShell
DavidPostill

1
ดูเหมือนว่าจะใช้ได้ แต่ฉันขอแนะนำให้คุณลองดู :)
DavidPostill

1
a-HA - เข้าใจแล้ว:: 1..9 | % $_{ mv ch$_*.* ch$_ }^ D
นายเคนเนดี

1
@ Mr.Kennedy คู่รักคู่นี้ คุณควรลองใช้งานgit addและดูว่ามันส่งคืนอะไร - โปรดจำไว้ว่า$_ภายใน foreach เป็นเพียงรายการอาร์เรย์แต่ละรายการของรายการไปป์ไลน์สุดท้าย (ซึ่งหมายความว่าcommitขั้นตอนในตัวอย่างของคุณจะไม่ได้รับตัวเลขดิบดังนั้นการเพิ่มchอีกครั้งอาจผิด ) นอกจากนี้ในตัวอย่างของคุณคอมมิชชันจะรัน (?) หลังจากเสร็จสิ้นการเพิ่มทั้งหมดซึ่งหมายความว่าการคอมมิทครั้งแรกจะได้รับทุกอย่าง ... หรือมิฉะนั้นคุณสามารถใช้หลาย ๆ คำสั่ง (คั่นด้วย;) ในขั้นตอน foreach เดียว
บ๊อบ

22

คุณไม่จำเป็นต้องเรียกใช้ mkdir หลายครั้งเพราะNew-Itemอาจใช้เส้นทางมากมาย ตัวอย่างเช่น:

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

@DavidPostill ได้อธิบายมากที่สุดของแนวคิดในคำตอบของเขา สิ่งนี้ยังใช้ประโยชน์จากการแก้ไขสตริงแทนการดำเนินการเชื่อมต่อที่ชัดเจน นอกจากนี้การ%จดชวเลขใช้แทนForEach-Objectแต่มีความหมายเหมือนกัน

น่าเสียดายที่ไม่มีวิธีง่าย ๆ ในการสอดแทรกสตริงเข้าไปในอาร์เรย์ของสตริงเช่นเดียวกับในทุบตี


2
@DavidPostill คุณได้อธิบายรายละเอียดให้มากกว่านี้แล้วนี่อาจเป็นส่วนเพิ่มเติมของคำตอบของคุณ: P
Bob

2
@DavidPostill โปรดอย่าลบ - คำอธิบายของคุณมีประโยชน์มาก
Mr. Kennedy

3
รุ่นที่เล่นกอล์ฟมากที่สุด:md(0..9|%{"ch$_"})
Ben N

2
@DavidPostill mdเป็นชื่อแทนมาตรฐานสำหรับmkdirซึ่งเป็นฟังก์ชัน PowerShell เป็นบ๊อบกล่าวเป็นนามแฝงมาตรฐาน% ForEach-Objectสายดับเบิลยกมาสอดแทรกตัวแปรเพื่อให้เทียบเท่ากับ"ch$_" 'ch' + $_คุณสามารถค้นหานามแฝงโดยใช้Get-Command( gcm) กับมัน
Ben N

1
@ บางสิ่งบางอย่าง Mr.Kennedy ชอบหรือ1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"} 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}ความคิดเห็นเหล่านี้เริ่มมานานแล้วดังนั้นหากคุณมีคำถามเพิ่มเติม - โปรดถามพวกเขาเป็นคำถามหรืออาจเข้าสู่การแชท
บ๊อบ

1

ฉันจะใช้สำหรับรุ่นลูปเนื่องจากมันง่ายต่อการจดจำและสามารถนำไปใช้กับหลาย ๆ สถานการณ์ได้ แม้มันสามารถใช้สำหรับหลายคำสั่ง

สำหรับคำสั่ง bash ที่เทียบเท่านี้:

สำหรับฉันใน {1..9}; ทำ
mkdir ch $ i
เสร็จแล้ว

... ในการใช้ PowerShell:

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

mamum คุณสามารถชี้แจง - ฉันได้รับข้อผิดพลาดเมื่อฉันเรียกใช้รหัสของคุณจากบรรทัดคำสั่ง PowerShell หรือเป็นสคริปต์ ps1: Missing opening '(' after keyword 'for'.คำสั่งนี้: foreach ($i in 1..9) {md ch$i}ทำให้ฉันได้รับหมายเลข "ch" ไดเรกทอรี apter แต่ฉันไม่เข้าใจของคุณ "สำหรับ .. ; do ... Done "loop
นายเคนเนดี้

สำหรับลูปที่ฉันใช้ที่นี่คือสำหรับเชลล์ bash (/ bin / sh) ฉันมักจะเปลี่ยนเปลือกของฉันเป็นทุบตีตามที่ฉันคุ้นเคยกับเปลือกนี้ สำหรับ ps คุณต้องใช้ไวยากรณ์ที่แตกต่างสำหรับ for loop (โปรดดูลิงค์ที่แนบมาss64.com/ps/for.html )
Osman Mamun

1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}ขอบคุณ mamun แต่ฉันยังไม่ได้ "Bourne อีกครั้ง ... ";) (หรือฉันไม่รู้ C ++ แต่ฉันคิดว่าฉัน sorta เข้าใจสิ่งที่ "$ i-le" (ถ้าน้อยกว่าหรือเท่ากับ?) และ "$ i ++" (~ "i + = 1"?) หมายถึงและกำลังทำตามคำสั่ง ...
Mr. Kennedy

1
ใช่อาร์กิวเมนต์ ca สามารถอ่านได้สำหรับ (เริ่มต้น i จาก 1 ตราบใดที่ฉันน้อยกว่าหรือเท่ากับ 1 เพิ่ม i ด้วย 1) {ทำซ้ำซ้ำ ๆ }
Osman Mamun

1

สร้างหลายไดเรกทอรีภายใต้ไดเรกทอรีปัจจุบัน:

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

ด้านบนเป็นเวอร์ชั่นสั้น ๆ ดังนี้ สังเกตุ at-sign ที่รวมอยู่ด้านหน้าอาร์เรย์ของสตริงและการใช้พารามิเตอร์ที่มีชื่อ:

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

และถ้าคุณต้องการไปตลอดทางคำสั่งเนทีฟแบบเต็มจะเป็น:

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

เมื่อใช้บรรทัดคำสั่ง PowerShell ฉันใช้เวอร์ชันย่อ

เมื่อเขียนสคริปต์โดยเฉพาะอย่างยิ่งสำหรับคนอื่น ๆ (ที่อาจใหม่กับ PowerShell) ฉันมักจะเขียนคำสั่งแบบเต็ม

เลือกสิ่งที่ดีที่สุดสำหรับคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.