このコマンドを使用して、すべてのサブアイテムを再帰的に取得できます。
Get-ChildItem -recurse
しかし、深さを制限する方法はありますか?たとえば、1つまたは2つのレベルだけを再帰したい場合はどうすればよいですか?
このコマンドを使用して、すべてのサブアイテムを再帰的に取得できます。
Get-ChildItem -recurse
しかし、深さを制限する方法はありますか?たとえば、1つまたは2つのレベルだけを再帰したい場合はどうすればよいですか?
これを使用して、深さを2に制限します。
Get-ChildItem \*\*\*,\*\*,\*
それが機能する方法は、各深さ2、1、および0の子を返すことです。
説明:
このコマンド
Get-ChildItem \*\*\*
2つのサブフォルダーの深さを持つすべてのアイテムを返します。\ *を追加すると、検索するサブフォルダが追加されます。
OPの質問に沿って、get-childitemを使用した再帰検索を制限するには、検索できるすべての深さを指定する必要があります。
powershell 5.0以降、 !で-Depth
パラメーターを使用できるようになりました。Get-ChildItem
と組み合わせて-Recurse
、再帰を制限します。
Get-ChildItem -Recurse -Depth 2
この関数を試してください:
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)")
}
}
}
}
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行を出力する関数です。おそらくはるかに読みやすいです。
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:ファイルツリーのプルーニングとコマンドレットの拡張」に基づいています。
@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
}
$ path = C:
$ depth = 0#、0はベース、1フォルダーは深く、2フォルダーは深く
Get-ChildItem -Path $ path -Depth $ depth | Where-Object{$_。Extension-eq".extension"}