web-dev-qa-db-ja.com

Get-ChildItemを使用してディレクトリのみを取得する方法を教えてください。

PowerShell 2.0を使用していますが、特定のパスのすべてのサブディレクトリをパイプアウトします。次のコマンドはすべてのファイルとディレクトリを出力しますが、ファイルを除外する方法がわかりません。

Get-ChildItem c:\mypath -Recurse

属性を取得するために$_.Attributesを使用しようとしましたが、それと比較するためにSystem.IO.FileAttributesのリテラルインスタンスを作成する方法がわかりません。 cmd.exeでは、

dir /b /ad /s
211
Peter Hull

PowerShellバージョン3.0未満の場合:

Get-ChildItemによって返されるFileInfoオブジェクトは、 "base"プロパティ、PSIsContainerを持ちます。それらの項目だけを選択します。

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

ディレクトリの生の文字列名が欲しい場合は、

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

PowerShell 3.0以降の場合:

dir -Directory
256
xcud

PowerShell 3.0では、もっと簡単です。

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

つかいます

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)でテスト済み。

45
Sachin Joseph

よりクリーンなアプローチ

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

PowerShell 3.0にはディレクトリのみを返すスイッチがあるのでしょうか。追加するのは論理的なことのようです。

20
Carlos Nunez

つかいます:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }
11

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"
6
Bill

この方法では、必要なテキストが少なくなります。

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

つかいます:

dir -Directory -Recurse | Select FullName

これにより、ディレクトリ専用のフォルダ名を持つルート構造の出力が得られます。

3
Wesley

つかいます:

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
3
Marty Gomez

以下のスクリプトを使用すると、もう少し読みやすくて単純なアプローチを実現できます。

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

お役に立てれば!

2
Zorayr

最初にすべてのフォルダとファイルを再帰的に取得するには、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 ;
}
2
sonjz

受け入れられた答えは言及します

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
sevenforce

私の解決策は、TechNetの記事Get-ChildItemコマンドレットでできることに基づいています。

Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}

私は自分のスクリプトでそれを使用しましたが、それはうまく機能します。

1
Sarrus

これを使う:

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

元の質問に具体的に回答するには(IO.FileAttributesを使用):

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

私はMarekの解決策を好みます(Where-Object { $_ -is [System.IO.DirectoryInfo] })。

0
Nico57