Get-ChildItemの再帰の深さを制限する


82

このコマンドを使用して、すべてのサブアイテムを再帰的に取得できます。

Get-ChildItem -recurse

しかし、深さを制限する方法はありますか?たとえば、1つまたは2つのレベルだけを再帰したい場合はどうすればよいですか?

回答:


109

これを使用して、深さを2に制限します。

Get-ChildItem \*\*\*,\*\*,\*

それが機能する方法は、各深さ2、1、および0の子を返すことです。


説明:

このコマンド

Get-ChildItem \*\*\*

2つのサブフォルダーの深さを持つすべてのアイテムを返します。\ *を追加すると、検索するサブフォルダーが追加されます。

OPの質問に沿って、get-childitemを使用した再帰検索を制限するには、検索できるすべての深度を指定する必要があります。


非常にすばらしい。PowerShellでこれを行う必要はなかったと思いますが、以前はCMD.EXEでこれを望んでいたことはわかっています。
アフォリア2012年

15
中間の深さを引き込むには、「-path \ * \ * \ *、\ * \ *、\ *」を実行する必要があるようです。
Gerard ONeill 2013

試してみましたが、下がらずに上がっているようです。superuser.com/questions/258287/…のようにフォルダツリーを生成するにはどうすればよいですか?ありがとうございました。
Royi 2016

2
現在のディレクトリから再帰を開始するには、各パスの先頭にドットを追加する必要があります。Get-ChildItem .\*\*\*,.\*\*,.\*ある時点で、PowerShell 5.1により、Get-ChildItemに-Depthパラメーターが追加されました。
点灯

65

powershell 5.0以降-DepthGet-ChildItem!でパラメーターを使用できるようになりました。

と組み合わせて-Recurse、再帰を制限します。

Get-ChildItem -Recurse -Depth 2

4
が指定されて-Recurseいる場合、スイッチはオプション/暗黙のようです-Depth
チャーリージョイント2017

7
これで奇妙に思えるのは-Exclude、に含まれて-Depthいると-Depth値が無効になることです。
ATek 2017年

2
@ ssaviers-Includeでも同じ問題が発生します。
Eternal 2119年

価値があるので、ワイルドカードと組み合わせる場合、-Depthパラメーターは無視されているように見えました。たとえば、gci c:\*.exe -Depth 1ファイルを複数のサブディレクトリの深さで返します。
GuitarPicker

知っておくと良い!gci c:\ -filter *.exe -depth 1おそらくあなたが望むものを手に入れるでしょう@GuitarPicker私は今テストするWindowsマシンを持っていません
ディー

9

この機能を試してください:

Function Get-ChildItemToDepth {
    Param(
        [String]$Path = $PWD,
        [String]$Filter = "*",
        [Byte]$ToDepth = 255,
        [Byte]$CurrentDepth = 0,
        [Switch]$DebugMode
    )

    $CurrentDepth++
    If ($DebugMode) {
        $DebugPreference = "Continue"
    }

    Get-ChildItem $Path | %{
        $_ | ?{ $_.Name -Like $Filter }

        If ($_.PsIsContainer) {
            If ($CurrentDepth -le $ToDepth) {

                # Callback to this function
                Get-ChildItemToDepth -Path $_.FullName -Filter $Filter `
                  -ToDepth $ToDepth -CurrentDepth $CurrentDepth
            }
            Else {
                Write-Debug $("Skipping GCI for Folder: $($_.FullName) " + `
                  "(Why: Current depth $CurrentDepth vs limit depth $ToDepth)")
            }
        }
    }
}

ソース


1
それは実際に機能します。サンプルの呼び出し:Get-ChildItemToDepth -ToDepth 2(カレントディレクトリに取り組ん)
ピーター・モーテンセン

1

Resolve-Pathを使用してGet-ChildItemの再帰の深さを制限しようとしました

$PATH = "."
$folder = get-item $PATH 
$FolderFullName = $Folder.FullName
$PATHs = Resolve-Path $FolderFullName\*\*\*\
$Folders = $PATHs | get-item | where {$_.PsIsContainer}

しかし、これは正常に機能します:

gci "$PATH\*\*\*\*"

1

これは、深さレベルに応じてインデントを付けて、アイテムごとに1行を出力する関数です。おそらくはるかに読みやすいです。

function GetDirs($path = $pwd, [Byte]$ToDepth = 255, [Byte]$CurrentDepth = 0)
{
    $CurrentDepth++
    If ($CurrentDepth -le $ToDepth) {
        foreach ($item in Get-ChildItem $path)
        {
            if (Test-Path $item.FullName -PathType Container)
            {
                "." * $CurrentDepth + $item.FullName
                GetDirs $item.FullName -ToDepth $ToDepth -CurrentDepth $CurrentDepth
            }
        }
    }
}

これは、ブログ投稿「実用的なPowerShell:ファイルツリーのプルーニングとコマンドレットの拡張」に基づいています。


0

@scanlegentil私はこれが好きです。
少し改善されるでしょう:

$Depth = 2
$Path = "."

$Levels = "\*" * $Depth
$Folder = Get-Item $Path
$FolderFullName = $Folder.FullName
Resolve-Path $FolderFullName$Levels | Get-Item | ? {$_.PsIsContainer} | Write-Host

前述のように、これは指定された深度のみをスキャンするため、この変更は改善されています。

$StartLevel = 1 # 0 = include base folder, 1 = sub-folders only, 2 = start at 2nd level
$Depth = 2      # How many levels deep to scan
$Path = "."     # starting path

For ($i=$StartLevel; $i -le $Depth; $i++) {
    $Levels = "\*" * $i
    (Resolve-Path $Path$Levels).ProviderPath | Get-Item | Where PsIsContainer |
    Select FullName
}

これにより、指定した深さまでのすべてのサブフォルダー名が表示されます
kevro 2015年

1
これは、アイテムを表示するように見えるではない、所定の深さまで所定の深さ。
sancho.s ReinstateMonicaCellio 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.