ใน PowerShell ฉันสามารถเรียกใช้สิ่งนี้ในหนึ่งซับ
Get-ChildItem | foreach {
if ($_ -match '.+?\.py$' -eq $true) {
$_ | Do-Thing -WithFile
}
if ($_ -match '.+?\.pdf$' -eq $true) {
$_ | Do-Thing -WithOtherFile
}
}
ชอบมาก
Get-ChildItem | foreach { if ($_ -match '.+?\.py$' -eq $true) { $_ | Do-Thing -WithFile } if ($_ -match '.+?\.pdf$' -eq $true) { $_ | Do-Thing -WithOtherFile } }
การทำงานเฉพาะของสิ่งนี้ที่ฉันชื่นชมคือการสามารถอ้างอิงวัตถุไปป์ไลน์ผ่าน $_
ที่จะใช้ในคำสั่งถัดไปและความสามารถในการดำเนินการตามเงื่อนไขขึ้นอยู่กับชิ้นส่วนแยกของเอาต์พุต | foreach {}
.
ฉันรู้ว่าในทุบตีมันจะง่ายต่อการ grep หลายรูปแบบในครั้งเดียวผ่าน
> ls | egrep '\.py$|\.pdf$'
some_foo.py
some_bar.py
foo.pdf
bar.pdf
เป็นไปได้หรือไม่ที่จะขยายสิ่งนี้ในหนึ่งซับด้วยสิ่งที่มีอยู่ตามค่าเริ่มต้นที่ฉันสามารถทำเทียบเท่าได้
| foreach { if ($_ -match '.+?\.py$') {Do-Thing -With $_ } if (...) { Do-Thing -WithOther $_ } }
หรือ Bash เพียงเปลี่ยนเส้นทาง stdout ของคำสั่งหนึ่งไปยัง stdin ของอีกคำสั่งหนึ่ง ฉันพบว่ามีหลายอย่างที่ใช้กับไดนามิกนี้ใน PowerShell แต่ไม่เคยได้ยินเรื่องของ Bash
นี่ไม่ใช่การปิดกั้นและการเขียนสคริปต์ในไวยากรณ์ปกติทำงานได้ดีฉันแค่อยากรู้อยากเห็นเพราะมันมีประโยชน์อย่างเหลือเชื่อใน PS
กำลังมองหา: $_ , | foreach {}
เทียบเท่าที่ฉันสามารถแยกเอาต์พุตตรวจสอบเงื่อนไขบนมันจากนั้นสามารถอ้างอิงส่วนแยกของเอาต์พุตผ่านชื่อบางชื่อ ในกรณีของ PS $ _
ฉันรู้ว่ามีหลายวิธีที่ PS แตกต่างจาก Bash อย่างมากดังนั้นฉันจะไม่แปลกใจหากนี่เป็น PS เฉพาะ
เพื่อบริบทที่ดีกว่านี่คือตัวอย่างใน PS ที่คุณจะค้นหาไฟล์ซ้ำด้วย python และส่วนขยาย pdf และสร้างบันทึกของไฟล์เหล่านั้นในไฟล์ข้อความที่เกี่ยวข้อง
Get-ChildItem -Recurse | foreach {
if ($_ -match '.+?\.py$' -eq $true) {
$_ | Out-File -encoding utf8 -Append py_list.txt
}
if ($_ -match '.+?\.pdf$' -eq $true) {
$_ | Out-File -encoding utf8 -Append pdf_list.txt
}
}