PowerShell 2.0を使用していますが、特定のパスのすべてのサブディレクトリをパイプアウトします。次のコマンドはすべてのファイルとディレクトリを出力しますが、ファイルを除外する方法がわかりません。
Get-ChildItem c:\mypath -Recurse
属性を取得するために$_.Attributes
を使用しようとしましたが、それと比較するためにSystem.IO.FileAttributes
のリテラルインスタンスを作成する方法がわかりません。 cmd.exe
では、
dir /b /ad /s
PowerShellバージョン3.0未満の場合:
Get-ChildItem
によって返されるFileInfo
オブジェクトは、 "base"プロパティ、PSIsContainer
を持ちます。それらの項目だけを選択します。
Get-ChildItem -Recurse | ?{ $_.PSIsContainer }
ディレクトリの生の文字列名が欲しい場合は、
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName
PowerShell 3.0以降の場合:
dir -Directory
PowerShell 3.0では、もっと簡単です。
Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
つかいます
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)でテスト済み。
よりクリーンなアプローチ
Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}
PowerShell 3.0にはディレクトリのみを返すスイッチがあるのでしょうか。追加するのは論理的なことのようです。
つかいます:
dir -r | where { $_ -is [System.IO.DirectoryInfo] }
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"
この方法では、必要なテキストが少なくなります。
ls -r | ? {$_.mode -match "d"}
つかいます:
dir -Directory -Recurse | Select FullName
これにより、ディレクトリ専用のフォルダ名を持つルート構造の出力が得られます。
つかいます:
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
convertto-csv -NoTypeInformation
Out-File c:\temp\mydirectorylist.csv
以下のスクリプトを使用すると、もう少し読みやすくて単純なアプローチを実現できます。
$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
if ($_.Attributes -eq "Directory") {
Write-Host $_.FullName
}
}
お役に立てれば!
最初にすべてのフォルダとファイルを再帰的に取得するには、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 ;
}
受け入れられた答えは言及します
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName
「生の文字列」を取得する。しかし実際にはSelected.System.IO.DirectoryInfo
型のオブジェクトが返されます。生の文字列の場合、次のものを使用できます。
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }
値が文字列に連結されている場合、違いは重要です。
Select-Object
と驚くほどfoo\@{FullName=bar}
ForEach
-演算子を使用すると予想されます。foo\bar
私の解決策は、TechNetの記事Get-ChildItemコマンドレットでできることに基づいています。
Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}
私は自分のスクリプトでそれを使用しましたが、それはうまく機能します。
これを使う:
Get-ChildItem -Path \\server\share\folder\ -Recurse -Force | where {$_.Attributes -like '*Directory*'} | Export-Csv -Path C:\Temp\Export.csv -Encoding "Unicode" -Delimiter ";"
元の質問に具体的に回答するには(IO.FileAttributesを使用):
Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}
私はMarekの解決策を好みます(Where-Object { $_ -is [System.IO.DirectoryInfo] }
)。