मैं इस आदेश का उपयोग करके सभी उप-आइटमों को पुन: प्राप्त कर सकता हूं:
Get-ChildItem -recurse
लेकिन क्या गहराई को सीमित करने का एक तरीका है? अगर मैं केवल उदाहरण के लिए एक या दो स्तरों को कम करना चाहता हूं?
जवाबों:
गहराई को 2 तक सीमित करने के लिए इसका उपयोग करें:
Get-ChildItem \*\*\*,\*\*,\*
इसके काम करने का तरीका यह है कि यह प्रत्येक गहराई 2,1 और 0 पर बच्चों को लौटाता है।
स्पष्टीकरण:
यह आज्ञा
Get-ChildItem \*\*\*
दो सबफ़ोल्डर की गहराई के साथ सभी आइटम लौटाता है। जोड़ना * * में खोज करने के लिए एक अतिरिक्त सबफ़ोल्डर जोड़ता है।
ओपी प्रश्न के अनुरूप, गेट-चाइल्डिटेम का उपयोग करके एक पुनरावर्ती खोज को सीमित करने के लिए आपको उन सभी गहराईयों को निर्दिष्ट करना होगा जो खोज की जा सकती हैं।
Get-ChildItem .\*\*\*,.\*\*,.\*
कुछ बिंदु पर, PowerShell 5.1 द्वारा, Get-ChildItem के पास अब एक -Depth
पैरामीटर है।
5.0 5.0 शक्तियां के रूप में , अब आप -Depth
पैरामीटर का उपयोग कर सकते हैं Get-ChildItem
!
आप इसे -Recurse
पुनरावृत्ति को सीमित करने के लिए जोड़ते हैं ।
Get-ChildItem -Recurse -Depth 2
-Recurse
स्विच वैकल्पिक है / -Depth
निर्दिष्ट होने पर निहित है।
-Exclude
जब मूल्य को -Depth
नकारा जाता है -Depth
।
gci c:\*.exe -Depth 1
रिटर्न कई उपनिर्देशिका फ़ाइलों को गहरा करती है।
gci c:\ -filter *.exe -depth 1
शायद आपको मिलेगा कि आप क्या चाहते हैं @GuitarPicker मेरे पास अभी परीक्षण करने के लिए एक विंडोज़ मशीन नहीं है
इस फ़ंक्शन का प्रयास करें:
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)")
}
}
}
}
Get-ChildItemToDepth -ToDepth 2
(वर्तमान निर्देशिका पर काम कर रहे)
मैंने हल-पथ का उपयोग करके गेट-चाइल्डइम पुनरावृत्ति की गहराई को सीमित करने की कोशिश की
$PATH = "."
$folder = get-item $PATH
$FolderFullName = $Folder.FullName
$PATHs = Resolve-Path $FolderFullName\*\*\*\
$Folders = $PATHs | get-item | where {$_.PsIsContainer}
लेकिन यह ठीक काम करता है:
gci "$PATH\*\*\*\*"
यह एक ऐसा फंक्शन है जो प्रति पंक्ति एक आइटम को गहराई स्तर के अनुसार इंडेंटेशन के साथ आउटपुट करता है। यह शायद अधिक पठनीय है।
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
}
}
}
}
यह एक ब्लॉग पोस्ट पर आधारित है, प्रैक्टिकल पावरशेल: प्रूनिंग फाइल ट्रीज़ और एक्सटेंडिंग सीमलेट्स ।
@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
}