Yalnızca Get-ChildItem kullanarak dizinleri nasıl edinebilirim?


242

PowerShell 2.0 kullanıyorum ve belirli bir yolun tüm alt dizinlerini engellemek istiyorum. Aşağıdaki komut tüm dosyaları ve dizinleri çıkarır, ancak dosyaları nasıl filtreleyeceğimizi anlayamıyorum.

Get-ChildItem c:\mypath -Recurse

$_.AttributesÖznitelikleri almak için kullanmayı denedim ama sonra System.IO.FileAttributeskarşılaştırmak için gerçek bir örnek oluşturmak nasıl bilmiyorum . İçinde cmd.exeolurdu

dir /b /ad /s

Yanıtlar:


292

3.0'dan küçük PowerShell sürümleri için:

FileInfoTarafından döndürülen nesne Get-ChildItem, bir "temel" özelliğine sahiptir, PSIsContainer. Yalnızca bu öğeleri seçmek istiyorsunuz.

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

Dizinlerin ham dize adlarını istiyorsanız,

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

PowerShell 3.0 ve üstü için:

dir -Directory

20
Keşke "IsFolder" la takılmıştı.
xcud

5
xcud: PSDrive tarafından temsil edilen her hiyerarşi klasör tabanlı değildir.
Joey

10
"Konteyner" ve "klasör" arasındaki anlamsal boşluk, bir kamyonu sürdürebileceğiniz bir boşluk değildir.
xcud

5
@xcud: iraSenthil'in cevabına bakın. -Directory ve -File Get-ChildItem üzerinde de çalışır. PSIsContainer özniteliğini doğrudan kullanmaya gerek yoktur.
Wouter

(Get-ChildItem |? {$ _. PSIsContainer} | Ad Seçin) .Ad
Jose Ortega

195

PowerShell 3.0'da daha basittir:

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

33
dir Get-ChildItem
Chip McCormick

1
@crashmstr Emin misin? PS4.0'ımı kontrol ettim. Benim diriçin takma adı Get-ChildItemve -Directoryve -Fileseçenekleri açıklandığı gibi çalıştı. Ben komutları kullanılır echo $PSVersionTable, help dir, dir -Directoryve dir -Filebu yorum ile gelip.
Peter Hull

3
Bu cevap olmalı
Chris S

2
lsve zehirini dirtakma adları varGet-ChildItem
Kolob Kanyonu

53

kullanım

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

Takma adları tercih ediyorsanız,

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

veya

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

Alt dizinleri de yinelemek için -rseçenek ekleyin .

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 ve Linux) ve PowerShell 7.0 (Windows 10, Mac ve Linux) üzerinde test edilmiştir .

Not : PowerShell Core'da, -ranahtarı belirttiğinizde sembolik bağlantılar izlenmez . Sembolik bağlantıları izlemek için -FollowSymlinkanahtarı ile belirtin -r.

Not 2 : 6.0 sürümünden bu yana PowerShell artık platformlar arasıdır. Platformlar arası sürüm ilk olarak PowerShell Core olarak adlandırıldı, ancak "Core" kelimesi PowerShell 7.0+ sürümünden bu yana kaldırıldı.

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


2
Bu, OP'nin özel ihtiyacı olan Powershell 2.0'da çalışmaz. - [/ Dir / Directory], Powershell 2.0'da geçerli parametreler değil
Ben Personick

21

Daha temiz bir yaklaşım:

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

PowerShell 3.0 yalnızca dizinleri döndüren bir anahtarı olup olmadığını merak ediyorum; eklemek mantıklı bir şey gibi görünüyor.


1
FYI powershell 3.0 -Directoryve -Filebayrakları ekler
WickyNilliams


6

PowerShell v2 ve daha yenisinden (k, aramaya başladığınız klasörü temsil eder):

Get-ChildItem $Path -attributes D -Recurse

Yalnızca klasör adlarını istiyorsanız, başka bir şey istemiyorsanız şunu kullanın:

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

Belirli bir klasör arıyorsanız, aşağıdakileri kullanabilirsiniz. Bu durumda, şu adlı bir klasör arıyorum myFolder:

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

Ve PS 3.0 o 4.0 mı kullanıyorsunuz?
Kiquenet

5
Öznitelikler parametresi PS2'de görünmüyor, "Öznitelikler" parametre adıyla eşleşen bir parametre bulunamadı "hatası veriyor. PS3'te iyi çalışıyor.
WileCau

5

Bu yaklaşımla daha az metin gerekir:

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

Kullanacağım bu.
David Betz

2
Daha da kısa: ls -r | ? {$ _. mode
-match

Bu sıkıştırılmış klasörler bulamıyor
Charles Lambert

7
Sıkıştırılmış bir klasör bir zip dosyası olduğundan
user1594322

Her şeyi tekrarlamak her zaman yararlı değildir. Son derece derin ve gür bir ağacınız olabilir, burada sadece iki seviye aşağı dizinlerle ilgilenirsiniz; otuz seviye aşağıya inmek zaman kaybıdır.
Ross Presser

4

kullanın:

dir -Directory -Recurse | Select FullName

Bu, yalnızca dizinler için klasör adıyla kök yapısının bir çıktısını verecektir.


3

kullanın:

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

Hangisi aşağıdakileri yapar

  • Hedef konumdaki dizinlerin bir listesini alın: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • Yalnızca dizinlerin adını ayıklayın: Select-Object -Property name
  • Çıktıyı CSV biçimine dönüştürün: convertto-csv -NoTypeInformation
  • Sonucu bir dosyaya kaydedin: Out-File c:\temp\mydirectorylist.csv

2
Her bir adımı açıklayabilmeniz harika olur, böylece daha fazla insan neler olup bittiğini görebilir.
jazzurro

Bu, OP'nin özel ihtiyacı olan Powershell 2.0'da çalışmaz. - [/ Dir / Directory], Powershell 2.0'da geçerli parametreler değil
Ben Personick

2

Aşağıdaki senaryo ile biraz daha okunabilir ve basit bir yaklaşım elde edilebilir:

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

Bu yardımcı olur umarım!


2

Önce tüm klasörleri ve dosyaları özyinelemeli olarak almak için Get-ChildItem'i kullanmak istersiniz . Ve sonra bu çıktıyı yalnızca dosyaları alan bir Where-Object yan tümcesine ekleyin.

# 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

Kabul edilen cevaptan bahsediliyor

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

"raw string" almak için. Ama aslında tür nesneler Selected.System.IO.DirectoryInfoiade edilecektir. Ham dizeler için aşağıdakiler kullanılabilir:

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

Değer bir dizeye birleştirilirse fark önemlidir:

  • ile Select-Objectşaşırtıcıfoo\@{FullName=bar}
  • ile ForEach-Operatör beklenen:foo\bar

1
Select-Object aslında PSCustomObject türündeki nesneleri döndürür. Ham dizeleri yaptığınız gibi% (ForEach-Object) kullanabilirsiniz, ancak kullanabilirsinizSelect-Object -ExpandProperty FullName
JamesQMurphy


0

Bunu kullan:

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

0

Orijinal soruyu özellikle yanıtlamak için (IO.FileAttributes kullanarak):

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

Ben Marek'in çözümünü tercih ederim ( Where-Object { $_ -is [System.IO.DirectoryInfo] }).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.