Bagaimana cara saya mendapatkan hanya direktori yang menggunakan Get-ChildItem?

242

Saya menggunakan PowerShell 2.0 dan saya ingin menyalurkan semua subdirektori dari jalur tertentu. Perintah berikut menampilkan semua file dan direktori, tetapi saya tidak tahu cara memfilter file.

Get-ChildItem c:\mypath -Recurse

Saya sudah mencoba menggunakan $_.Attributesuntuk mendapatkan atribut tetapi kemudian saya tidak tahu bagaimana membangun contoh literal System.IO.FileAttributesuntuk membandingkannya. Di cmd.exedalamnya akan

dir /b /ad /s
Peter Hull
sumber

Jawaban:

292

Untuk versi PowerShell kurang dari 3.0:

The FileInfoobjek dikembalikan oleh Get-ChildItemmemiliki "dasar" properti, PSIsContainer. Anda hanya ingin memilih item-item itu.

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

Jika Anda ingin nama string mentah dari direktori, Anda dapat melakukannya

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

Untuk PowerShell 3.0 dan lebih tinggi:

dir -Directory
xcud
sumber
20
Berharap itu alias "IsFolder".
xcud
5
xcud: Tidak setiap hierarki yang diwakili oleh PSDrive berbasis folder.
Joey
10
Kesenjangan semantik antara "wadah" dan "folder" bukan yang Anda bisa mengendarai truk.
xcud
5
@xcud: Lihat jawaban iraSenthil. -Directory dan -File juga berfungsi di Get-ChildItem. Tidak perlu menggunakan atribut PSIsContainer secara langsung.
Wouter
(Get-ChildItem |? {$ _. PSIsContainer} | Pilih Nama) .Nama
Jose Ortega
195

Di PowerShell 3.0, lebih sederhana:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
iraSenthil
sumber
33
dir adalah alias untuk Get-ChildItem
Chip McCormick
1
@ crashmstr Anda yakin? Saya memeriksa PS4.0 saya. Bagi saya, diralias Get-ChildItem, -Directorydan -Fileopsi dan bekerja seperti yang dijelaskan. Saya menggunakan perintah echo $PSVersionTable, help dir, dir -Directorydan dir -Fileuntuk datang dengan komentar ini.
Peter Hull
3
Ini harus menjadi jawabannya
Chris S
2
lsdan diralias untuk Get-ChildItemmengambil racun Anda
Kolob Canyon
53

Menggunakan

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

Jika Anda lebih suka alias, gunakan

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

atau

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

Untuk mengulangi subdirektori juga, tambahkan -ropsi.

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

Diuji pada PowerShell 4.0, PowerShell 5.0 (Windows 10), PowerShell Core 6.0 (Windows 10, Mac, dan Linux), dan PowerShell 7.0 (Windows 10, Mac, dan Linux).

Catatan : Pada PowerShell Core, symlink tidak diikuti ketika Anda menentukan -rsakelar. Untuk mengikuti symlink, tentukan -FollowSymlinksakelar dengan -r.

Catatan 2 : PowerShell sekarang lintas-platform, sejak versi 6.0. Versi cross-platform pada awalnya disebut PowerShell Core, tetapi kata "Core" telah dihapus sejak PowerShell 7.0+.

Dokumentasi Get-ChildItem: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem

Sachin Joseph
sumber
2
Ini tidak akan berfungsi di Powershell 2.0 yang merupakan kebutuhan khusus OP. the - [/ Dir / Directory] bukan parameter yang valid di Powershell 2.0
Ben Personick
21

Pendekatan yang lebih bersih:

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

Saya ingin tahu apakah PowerShell 3.0 memiliki saklar yang hanya mengembalikan direktori; sepertinya hal yang logis untuk ditambahkan.

Carlos Nunez
sumber
1
FYI PowerShell 3.0 menambahkan -Directorydan -Filebendera
WickyNilliams
12

Menggunakan:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }
Marek Dzikiewicz
sumber
6

Dari PowerShell v2 dan yang lebih baru (k mewakili folder tempat Anda memulai pencarian):

Get-ChildItem $Path -attributes D -Recurse

Jika Anda hanya ingin nama folder saja, dan tidak ada yang lain, gunakan ini:

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

Jika Anda mencari folder tertentu, Anda bisa menggunakan yang berikut ini. Dalam hal ini, saya mencari folder bernama myFolder:

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"
Tagihan
sumber
Dan menggunakan PS 3.0 o 4.0?
Kiquenet
5
Parameter Atribut tampaknya tidak ada di PS2, itu memberikan kesalahan "Parameter tidak dapat ditemukan yang cocok dengan nama parameter 'Atribut'". Ini berfungsi ok di PS3.
WileCau
5

Lebih sedikit teks diperlukan dengan pendekatan ini:

ls -r | ? {$_.mode -match "d"}
jyggorath
sumber
Ini yang saya gunakan.
David Betz
2
Bahkan lebih pendek: ls -r | ? {$ _. mode -match "d"}
jyggorath
Ini tidak menemukan folder terkompresi
Charles Lambert
7
Karena folder terkompresi adalah file zip
user1594322
Tidak selalu berguna untuk mengulang semuanya. Anda bisa memiliki pohon yang sangat dalam dan lebat di mana Anda hanya tertarik pada direktori tepat dua tingkat di bawah; mencari tiga puluh level ke bawah adalah buang-buang waktu.
Ross Presser
4

Menggunakan:

dir -Directory -Recurse | Select FullName

Ini akan memberi Anda output dari struktur root dengan nama folder hanya untuk direktori.

Wesley
sumber
3

Menggunakan:

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

Yang melakukan hal berikut

  • Dapatkan daftar direktori di lokasi target: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • Ekstrak hanya nama direktori: Select-Object -Property name
  • Konversi output ke format CSV: convertto-csv -NoTypeInformation
  • Simpan hasilnya ke file: Out-File c:\temp\mydirectorylist.csv
Marty Gomez
sumber
2
Alangkah baiknya jika Anda bisa menjelaskan setiap langkah sehingga lebih banyak orang dapat melihat apa yang sedang terjadi.
jazzurro
Ini tidak akan berfungsi di Powershell 2.0 yang merupakan kebutuhan khusus OP. the - [/ Dir / Directory] bukan parameter yang valid di Powershell 2.0
Ben Personick
2

Pendekatan yang lebih mudah dibaca dan sederhana dapat dicapai dengan skrip di bawah ini:

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

Semoga ini membantu!

Zorayr
sumber
2

Anda akan ingin menggunakan Get-ChildItem untuk secara rekursif mendapatkan semua folder dan file terlebih dahulu. Dan kemudian pipa output itu menjadi klausa Where-Object yang hanya mengambil file.

# 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 ;
}
sonjz
sumber
1

Jawaban yang diterima menyebutkan

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

untuk mendapatkan "string mentah". Namun pada kenyataannya objek bertipe Selected.System.IO.DirectoryInfoakan dikembalikan. Untuk string mentah berikut ini dapat digunakan:

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

Perbedaannya penting jika nilainya disatukan dengan string:

  • dengan Select-Object mengejutkanfoo\@{FullName=bar}
  • dengan ForEach-operator yang diharapkan:foo\bar
sevenforce
sumber
1
Select-Object akan mengembalikan objek bertipe PSCustomObject. Meskipun Anda dapat menggunakan% (yang merupakan ForEach-Object) untuk mendapatkan string mentah seperti yang Anda lakukan, Anda juga dapat menggunakanSelect-Object -ExpandProperty FullName
JamesQMurphy
0

Gunakan yang ini:

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

Untuk menjawab pertanyaan asli secara khusus (menggunakan IO.FileAttributes):

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

Saya lebih suka solusi Marek ( Where-Object { $_ -is [System.IO.DirectoryInfo] }).

Nicolas Melay
sumber