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

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

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

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


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.


1
FYI PowerShell 3.0 menambahkan -Directorydan -Filebendera
— WickyNilliams


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"

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"}

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.


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

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!


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 ;
}

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

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 ";"

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] }).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.