powershell - Get-ChildItem का उपयोग करके मैं केवल निर्देशिका कैसे प्राप्त करूं?




8 Answers

3.0 से कम PowerShell संस्करणों के लिए:

Get-ChildItem द्वारा लौटाई गई Get-ChildItem ऑब्जेक्ट में "बेस" प्रॉपर्टी, PSIsContainer । आप केवल उन वस्तुओं का चयन करना चाहते हैं।

Get-ChildItem -Recurse | ?{ $_.PSIsContainer }

यदि आप निर्देशिकाओं के कच्चे स्ट्रिंग नाम चाहते हैं, तो आप कर सकते हैं

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

PowerShell 3.0 और अधिक के लिए:

dir -Directory

मैं PowerShell 2.0 का उपयोग कर रहा हूं और मैं एक निश्चित पथ की सभी उप-निर्देशिकाओं को पाइप करना चाहता हूं। निम्न आदेश सभी फ़ाइलों और निर्देशिकाओं को आउटपुट करता है, लेकिन मैं फ़ाइलों को फ़िल्टर करने का तरीका नहीं समझ सकता।

Get-ChildItem c:\mypath -Recurse

मैंने $_.Attributes का उपयोग करने का प्रयास किया है $_.Attributes प्राप्त करने के लिए गुण, लेकिन तब मुझे नहीं पता कि System.IO.FileAttributes का एक शाब्दिक उदाहरण कैसे System.IO.FileAttributes , इसकी तुलना करने के लिए। cmd.exe यह होगा

dir /b /ad /s



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

उपनिर्देशिकाओं को भी पुन: साझा करने के लिए, add -r विकल्प।

ls -dir -r #lists only directories recursively
ls -file -r #lists only files recursively 

पावरशेल 4.0, पावरशेल 5.0 (विंडोज 10) और पावरशेल कोर 6.0 (विंडोज 10, मैक और लिनक्स) पर परीक्षण किया गया।




उपयोग:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }



इस दृष्टिकोण के साथ कम पाठ की आवश्यकता है:

ls -r | where {$_.mode -match "d"}



नीचे लिपि के साथ थोड़ा और अधिक पठनीय और सरल दृष्टिकोण प्राप्त किया जा सकता है:

$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
    if ($_.Attributes -eq "Directory") {
        Write-Host $_.FullName
    }
}

उम्मीद है की यह मदद करेगा!




स्वीकृत उत्तर का उल्लेख है

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

एक "कच्ची स्ट्रिंग" पाने के लिए। लेकिन वास्तव में Selected.System.IO.DirectoryInfo प्रकार की वस्तुएं। System.IO.DirectoryInfo वापस कर दी जाएगी। कच्चे तारों के लिए निम्नलिखित का उपयोग किया जा सकता है:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

अंतर तब मायने रखता है जब मान स्ट्रिंग से जुड़ा हुआ हो:

  • Select-Object suprisingly foo\@{FullName=bar}
  • ForEach -operator के साथ अपेक्षित: foo\bar



इसका प्रयोग करें:

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}

मैं मरेक के समाधान को पसंद करता हूं हालांकि ( Where-Object { $_ -is [System.IO.DirectoryInfo] } )।




Related