ฉันจะรับเฉพาะไดเรกทอรีที่ใช้ Get-ChildItem ได้อย่างไร


242

ฉันใช้ PowerShell 2.0 และฉันต้องการที่จะไพพ์ไดเรกทอรีย่อยทั้งหมดของเส้นทางที่แน่นอน คำสั่งต่อไปนี้จะแสดงผลไฟล์และไดเรกทอรีทั้งหมด แต่ฉันไม่สามารถหาวิธีกรองไฟล์ได้

Get-ChildItem c:\mypath -Recurse

ฉันพยายามใช้$_.Attributesเพื่อรับคุณลักษณะ แต่แล้วฉันก็ไม่รู้วิธีสร้างอินสแตนซ์ตามตัวอักษรSystem.IO.FileAttributesเพื่อเปรียบเทียบ ในcmd.exeมันจะเป็น

dir /b /ad /s

คำตอบ:


292

สำหรับ PowerShell เวอร์ชันน้อยกว่า 3.0:

FileInfoวัตถุกลับโดยGet-ChildItemมีทรัพย์สิน PSIsContainer"ฐาน" คุณต้องการเลือกเฉพาะรายการเหล่านั้น

Get-ChildItem -Recurse | ?{ $_.PSIsContainer }

หากคุณต้องการชื่อสตริงดิบของไดเรกทอรีคุณสามารถทำได้

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

สำหรับ PowerShell 3.0 และสูงกว่า:

dir -Directory

20
ความปรารถนาที่ถูกใช้นามแฝงเพื่อ "IsFolder"
xcud

5
xcud: ไม่ใช่ทุกลำดับชั้นที่แสดงโดย PSDrive นั้นเป็นแบบโฟลเดอร์
Joey

10
ช่องว่างทางความหมายระหว่าง "คอนเทนเนอร์" และ "โฟลเดอร์" ไม่ใช่ช่องว่างที่คุณสามารถขับรถบรรทุกได้
xcud

5
@xcud: ดูคำตอบของ iraSenthil ไดเรกทอรีและไฟล์ยังทำงานบน Get-ChildItem ไม่จำเป็นต้องใช้แอตทริบิวต์ PSIsContainer โดยตรง
Wouter

(Get-ChildItem |? {$ _. PSIsContainer} | เลือกชื่อ) .Name
Jose Ortega

195

ใน PowerShell 3.0 มันง่ายกว่า:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files

33
dir เป็นชื่อแทน Get-ChildItem
Chip McCormick

1
@crashmstr คุณแน่ใจเหรอ? ฉันตรวจสอบ PS4.0 ของฉันแล้ว สำหรับผมdirถูกนามแฝงGet-ChildItemและ-Directoryและ-Fileตัวเลือกการทำงานตามที่อธิบายไว้ ผมใช้คำสั่งecho $PSVersionTable, help dir, dir -Directoryและdir -Fileจะเกิดขึ้นกับความคิดเห็นนี้
Peter Hull

3
นี่ควรเป็นคำตอบ
Chris S

2
lsและdirเป็นนามแฝงของการGet-ChildItemรับพิษของคุณ
Kolob Canyon

53

ใช้

Get-ChildItem -dir #lists only directories
Get-ChildItem -file #lists only files

หากคุณต้องการนามแฝงให้ใช้

ls -dir #lists only directories
ls -file #lists only files

หรือ

dir -dir #lists only directories
dir -file #lists only files

หากต้องการเรียกคืนไดเรกทอรีย่อยด้วยให้เพิ่ม-rตัวเลือก

ls -dir -r #lists only directories recursively
ls -file -r #lists only files recursively 

ทดสอบบน PowerShell 4.0, PowerShell 5.0 (Windows 10), PowerShell Core 6.0 (Windows 10, Mac และ Linux) และPowerShell 7.0 (Windows 10, Mac และ Linux)

หมายเหตุ : บน PowerShell Core symlinks จะไม่ถูกติดตามเมื่อคุณระบุ-rสวิตช์ ที่จะปฏิบัติตาม symlinks ระบุสลับกับ-FollowSymlink-r

หมายเหตุ 2 : PowerShell ตอนนี้ข้ามแพลตฟอร์มตั้งแต่รุ่น 6.0 รุ่นข้ามแพลตฟอร์มเดิมเรียกว่า PowerShell Core แต่คำว่า "Core" ถูกลบตั้งแต่ PowerShell 7.0+

รับเอกสาร Child -em: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem


2
สิ่งนี้จะไม่ทำงานใน Powershell 2.0 ซึ่งเป็นความต้องการเฉพาะของ OP - [/ Dir / Directory] ไม่ใช่พารามิเตอร์ที่ถูกต้องใน Powershell 2.0
Ben Personick

21

แนวทางที่สะอาดกว่า:

Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}

ฉันสงสัยว่า PowerShell 3.0 มีสวิตช์ที่ส่งกลับเฉพาะไดเรกทอรีหรือไม่ ดูเหมือนว่ามีเหตุผลที่จะเพิ่ม


1
FYI powershell 3.0 เพิ่ม-Directoryและตั้ง-Fileค่าสถานะ
WickyNilliams


6

จาก PowerShell v2 และใหม่กว่า (k หมายถึงโฟลเดอร์ที่คุณกำลังเริ่มการค้นหาของคุณที่):

Get-ChildItem $Path -attributes D -Recurse

หากคุณต้องการชื่อโฟลเดอร์เท่านั้นและไม่มีอะไรอื่นให้ใช้สิ่งนี้:

Get-ChildItem $Path -Name -attributes D -Recurse

หากคุณกำลังมองหาโฟลเดอร์เฉพาะคุณสามารถใช้สิ่งต่อไปนี้ ในกรณีนี้ฉันกำลังมองหาโฟลเดอร์ชื่อmyFolder:

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"

และใช้ PS 3.0 o 4.0 หรือไม่
Kiquenet

5
ดูเหมือนแอตทริบิวต์ของพารามิเตอร์จะไม่อยู่ใน PS2 แต่จะให้ข้อผิดพลาด "ไม่พบพารามิเตอร์ที่ตรงกับชื่อพารามิเตอร์ 'แอตทริบิวต์'" มันทำงานได้ดีใน PS3
WileCau

5

ต้องใช้ข้อความน้อยลงในวิธีการนี้:

ls -r | ? {$_.mode -match "d"}

นี่คือสิ่งที่ฉันต้องการใช้
David Betz

2
ยิ่งสั้น: ls -r | ? {$ _. โหมด -match "d"}
jyggorath

ไม่พบโฟลเดอร์บีบอัด
Charles Lambert

7
เนื่องจากโฟลเดอร์ที่บีบอัดเป็นไฟล์ซิป
user1594322

มันไม่ได้มีประโยชน์เสมอไปที่จะชดเชยทุกอย่าง คุณสามารถมีต้นไม้ที่ลึกมากและเป็นพวงซึ่งคุณสนใจในไดเรกทอรีเพียงสองระดับเท่านั้น การค้นหาระดับสามสิบลงเป็นการเสียเวลา
Ross Presser

4

ใช้:

dir -Directory -Recurse | Select FullName

สิ่งนี้จะให้ผลลัพธ์ของโครงสร้างรูทที่มีชื่อโฟลเดอร์สำหรับไดเรกทอรีเท่านั้น


3

ใช้:

Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name |  convertto-csv -NoTypeInformation  | Out-File c:\temp\mydirectorylist.csv

ซึ่งทำสิ่งต่อไปนี้

  • รับรายการไดเรกทอรีในตำแหน่งเป้าหมาย: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • แยกเฉพาะชื่อของไดเรกทอรี: Select-Object -Property name
  • แปลงผลลัพธ์เป็นรูปแบบ CSV: convertto-csv -NoTypeInformation
  • บันทึกผลลัพธ์ลงในไฟล์: Out-File c:\temp\mydirectorylist.csv

2
มันจะดีมากถ้าคุณสามารถอธิบายแต่ละขั้นตอนเพื่อให้คนอื่นเห็นว่าเกิดอะไรขึ้น
jazzurro

สิ่งนี้จะไม่ทำงานใน Powershell 2.0 ซึ่งเป็นความต้องการเฉพาะของ OP the - [/ Dir / Directory] ไม่ใช่พารามิเตอร์ที่ถูกต้องใน Powershell 2.0
Ben Personick

2

สามารถอ่านและเรียบง่ายได้มากขึ้นด้วยสคริปต์ด้านล่าง:

$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
    if ($_.Attributes -eq "Directory") {
        Write-Host $_.FullName
    }
}

หวังว่านี่จะช่วยได้!


2

คุณจะต้องใช้Get-ChildItemเพื่อรับโฟลเดอร์และไฟล์ทั้งหมดซ้ำก่อน จากนั้นไปป์ที่เอาท์พุทลงในส่วนคำสั่งของวัตถุที่ใช้ไฟล์เท่านั้น

# one of several ways to identify a file is using GetType() which
# will return "FileInfo" or "DirectoryInfo"
$files = Get-ChildItem E:\ -Recurse | Where-Object {$_.GetType().Name -eq "FileInfo"} ;

foreach ($file in $files) {
  echo $file.FullName ;
}

1

คำตอบที่ได้รับการยอมรับกล่าวถึง

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

เพื่อรับ "raw string" แต่ในความเป็นจริงวัตถุประเภทSelected.System.IO.DirectoryInfoจะถูกส่งกลับ สำหรับสตริงดิบสามารถใช้งานได้ดังต่อไปนี้:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

ความแตกต่างนั้นสำคัญถ้าค่านั้นถูกต่อกับสตริง:

  • ด้วยอย่างSelect-Objectแปลกใจfoo\@{FullName=bar}
  • ด้วย - ผู้ForEachปฏิบัติงานที่คาดหวัง:foo\bar

1
Select-Object จะส่งคืนวัตถุประเภท PSCustomObject ในขณะที่คุณสามารถใช้% (ซึ่งก็คือ ForEach-Object) เพื่อรับสตริงดิบอย่างที่คุณทำคุณสามารถใช้Select-Object -ExpandProperty FullName
JamesQMurphy


0

ใช้อันนี้:

Get-ChildItem -Path \\server\share\folder\ -Recurse -Force | where {$_.Attributes -like '*Directory*'} | Export-Csv -Path C:\Temp\Export.csv -Encoding "Unicode" -Delimiter ";"

0

ในการตอบคำถามเดิมโดยเฉพาะ (ใช้ IO.FileAttributes):

Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}

ฉันชอบโซลูชันของ Marek มากกว่า ( Where-Object { $_ -is [System.IO.DirectoryInfo] })

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