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によって表されるすべての階層がフォルダーベースであるとは限りません。
ジョーイ

10
「コンテナ」と「フォルダ」の間のセマンティックギャップは、トラックを通過できるものではありません。
xcud

5
@xcud:iraSenthilの回答を参照してください。-Directoryおよび-Fileは、Get-ChildItemでも機能します。PSIsContainer属性を直接使用する必要はありません。
Wouter

(Get-ChildItem |?{$ _。PSIsContainer} | Select Name).Name
Jose Ortega

195

PowerShell 3.0では、より簡単です。

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

33
dirはGet-ChildItemのエイリアス
チップマコーミック

1
@crashmstrよろしいですか?PS4.0で確認しました。私にとって、dirはにエイリアスされGet-ChildItem-Directoryおよび-Fileオプションは説明どおりに機能しました。私は、コマンドを使用しecho $PSVersionTablehelp dirdir -Directoryおよびdir -Fileこのコメントを思い付きます。
Peter Hull

3
これが答えになるはずです
クリスS

2
lsそして、あなたの毒dirGet-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では、-rスイッチを指定してもシンボリックリンクはたどられません。シンボリックリンクをたどるには、で-FollowSymlinkスイッチを指定します-r

注2:バージョン6.0以降、PowerShellはクロスプラットフォームになりました。クロスプラットフォームバージョンはもともとPowerShell Coreと呼ばれていましたが、PowerShell 7.0以降、「コア」という言葉は削除されました。

Get-ChildItemのドキュメント:https ://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem


2
これは、OPの特定のニーズであったPowershell 2.0では機能しません。-[/ 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 2013


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または4.0を使用していますか?
Kiquenet 2013

5
属性パラメーターはPS2にないようで、「パラメーター名 '属性'に一致するパラメーターが見つかりません」というエラーが発生します。PS3では問題なく動作します。
WileCau 2014年

5

このアプローチでは、必要なテキストが少なくなります。

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

これは私が使用するものです。
David Betz 14年

2
さらに短く:ls -r | ?{$
_。mode

圧縮されたフォルダが見つかりません
Charles Lambert

7
圧縮フォルダはzipファイルであるため
user1594322

すべてを再帰的に実行することが常に役立つとは限りません。ちょうど2レベル下のディレクトリにのみ関心がある、非常に深くて茂みのあるツリーを作成できます。30レベル下の検索は時間の無駄です。
ロスプレッサー、2015

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 2014年

これは、OPの特定のニーズであったPowershell 2.0では機能しません。-[/ Dir / Directory]は、Powershell 2.0では有効なパラメーターではありません
Ben Personick

2

もう少し読みやすくシンプルなアプローチは、以下のスクリプトで実現できます。

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

お役に立てれば!


2

あなたは、使用したいと思うには、Get-ChildItemコマンドレットを再帰的に最初にすべてのフォルダとファイルを取得します。次に、その出力をWhere-Object句にパイプして、ファイルのみを取得します。

# 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

「生の文字列」を取得します。しかし、実際にはタイプのオブジェクト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}

私はマレクの解決策を好む(Where-Object { $_ -is [System.IO.DirectoryInfo] })。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.