सीमा प्राप्त करें- ChildItem पुनरावृत्ति गहराई


82

मैं इस आदेश का उपयोग करके सभी उप-आइटमों को पुन: प्राप्त कर सकता हूं:

Get-ChildItem -recurse

लेकिन क्या गहराई को सीमित करने का एक तरीका है? अगर मैं केवल उदाहरण के लिए एक या दो स्तरों को कम करना चाहता हूं?

जवाबों:


109

गहराई को 2 तक सीमित करने के लिए इसका उपयोग करें:

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

इसके काम करने का तरीका यह है कि यह प्रत्येक गहराई 2,1 और 0 पर बच्चों को लौटाता है।


स्पष्टीकरण:

यह आज्ञा

Get-ChildItem \*\*\*

दो सबफ़ोल्डर की गहराई के साथ सभी आइटम लौटाता है। जोड़ना * * में खोज करने के लिए एक अतिरिक्त सबफ़ोल्डर जोड़ता है।

ओपी प्रश्न के अनुरूप, गेट-चाइल्डिटेम का उपयोग करके एक पुनरावर्ती खोज को सीमित करने के लिए आपको उन सभी गहराईयों को निर्दिष्ट करना होगा जो खोज की जा सकती हैं।


इतना अद्भुत। मुझे लगता है कि मुझे PowerShell में ऐसा करने की आवश्यकता नहीं है, लेकिन मुझे पता है कि मैंने इसके लिए CMD.EXE में कामना की है।
एफोरिया

15
ऐसा लगता है कि आपको मध्यवर्ती गहराई में खींचने के लिए "-पाठ \ * \ * \ * *, \ * \", \ * "करना होगा।
जेरार्ड ओनेइल

मैंने इसे आजमाया, फिर भी यह नीचे की बजाय ऊपर जाता दिख रहा है। मैं इसका उपयोग कैसे कर सकता हूँ जैसे कि Superuser.com/questions/258287/… में एक Folder Tree उत्पन्न होता है ? धन्यवाद।
रॉय जू

2
वर्तमान निर्देशिका से पुनरावृत्ति शुरू करने के लिए, प्रत्येक पथ की शुरुआत में एक बिंदु जोड़ना होगा। Get-ChildItem .\*\*\*,.\*\*,.\*कुछ बिंदु पर, PowerShell 5.1 द्वारा, Get-ChildItem के पास अब एक -Depthपैरामीटर है।
जलाई गई

65

5.0 5.0 शक्तियां के रूप में , अब आप -Depthपैरामीटर का उपयोग कर सकते हैं Get-ChildItem!

आप इसे -Recurseपुनरावृत्ति को सीमित करने के लिए जोड़ते हैं ।

Get-ChildItem -Recurse -Depth 2

4
ऐसा लगता है कि -Recurseस्विच वैकल्पिक है / -Depthनिर्दिष्ट होने पर निहित है।
चार्ली जॉयंट

7
एक चीज जो मुझे इस बात से मिली कि यह अजीब लगती है -Excludeजब मूल्य को -Depthनकारा जाता है -Depth
एटीके

2
@ वासियों के साथ भी यही समस्या होती है-साथ ही साथ।
अनन्त

इसके लायक क्या है, वाइल्डकार्ड के साथ संयोजन करते समय -Depth पैरामीटर को अनदेखा किया गया। उदाहरण के लिए, gci c:\*.exe -Depth 1रिटर्न कई उपनिर्देशिका फ़ाइलों को गहरा करती है।
गिटारपाइकर

जानकार अच्छा लगा! gci c:\ -filter *.exe -depth 1शायद आपको मिलेगा कि आप क्या चाहते हैं @GuitarPicker मेरे पास अभी परीक्षण करने के लिए एक विंडोज़ मशीन नहीं है
dee-see

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

मैंने हल-पथ का उपयोग करके गेट-चाइल्डइम पुनरावृत्ति की गहराई को सीमित करने की कोशिश की

$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
            }
        }
    }
}

यह एक ब्लॉग पोस्ट पर आधारित है, प्रैक्टिकल पावरशेल: प्रूनिंग फाइल ट्रीज़ और एक्सटेंडिंग सीमलेट्स


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
}

यह सभी उप-फ़ोल्डर नामों को निर्दिष्ट गहराई तक
दिखाएगा

1
यह आइटम दिखाने के लिए प्रकट होता है पर एक दिया गहराई, नहीं करने के लिए एक दिया गहराई।
sancho.s ReinstateMonicaCellio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.