ไม่สามารถยกเว้นรูปแบบไดเรกทอรีซ้ำได้


30

ฉันกำลังพยายามดึงรายการย่อยของโฟลเดอร์ซ้ำ อย่างไรก็ตามโฟลเดอร์มีไฟล์เสียงรบกวนและโฟลเดอร์ (อันที่จริงนี่คือโฟลเดอร์โครงการ Visual Studio)

นี่คือสิ่งที่ฉันมี:

$root = Get-Item C:\Projects\MyProject

$allItems =  Get-ChildItem $root -Recurse -exclude "**\pkgobj\*"

อย่างไรก็ตาม$allItemsยังคงมีไฟล์และโฟลเดอร์ที่ตรงกับเส้นทาง

ฉันทำอะไรผิด

เพื่อให้แม่นยำยิ่งขึ้นฉันต้องการได้ทั้งโฟลเดอร์และไฟล์ แต่ไม่ใช่โฟลเดอร์ที่ระบุและสืบทอดใด ๆ

ฉันก็ลอง:

foreach($item in $allItems){
    if($item.FullName -notmatch "pkgobj") {
        Write-Host -ForegroundColor Green $item.FullName.Replace($root,'')

    }
}

แต่ไม่ประสบความสำเร็จ

คำตอบ:


44

เอาฉันสักครู่เพื่อทำความเข้าใจปัญหา มันเป็นเรื่องยุ่งยาก

-excludeใช้เฉพาะกับชื่อไฟล์หลักของรายการ (เช่นmyfile.txt) ไม่ใช่ชื่อเต็ม
(เช่นC:\pkgobj\myfile.txt) ที่คุณต้องการ ดังนั้นคุณไม่สามารถใช้การยกเว้นที่นี่

แต่มีวิธีใช้Fullnameและวิธีแก้ปัญหาคือ-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 

1
อย่างไรก็ตามหากคุณต้องการยกเว้นไดเรกทอรีขนาดใหญ่เนื่องจากประสิทธิภาพ (เช่น node_modules) สิ่งนี้จะไม่ช่วยได้เพราะมันจะตรวจสอบทุกอย่างซ้ำ ๆ และกรองในภายหลัง
Pluc

แล้วเรื่องนี้ล่ะ รับ - ChildItem - ยกเว้นlude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.