मैं गेट-चाइल्ड इटेम का उपयोग करके केवल निर्देशिका कैसे प्राप्त करूं?


242

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

Get-ChildItem c:\mypath -Recurse

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

dir /b /ad /s

जवाबों:


292

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

FileInfoवस्तु द्वारा लौटाए गए Get-ChildItemएक "आधार" संपत्ति है, PSIsContainer। आप केवल उन वस्तुओं का चयन करना चाहते हैं।

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

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

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

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

dir -Directory

20
काश कि "IsFolder" का उपनाम होता।
xcud

5
xcud: पीएसडीआरवी द्वारा प्रस्तुत हर पदानुक्रम फ़ोल्डर-आधारित नहीं है।
जॉय

10
"कंटेनर" और "फ़ोल्डर" के बीच का शब्दार्थ अंतर वह नहीं है जिसके द्वारा आप ट्रक चला सकते हैं।
xcud

5
@ हंसी: देखें iSSenthil का जवाब -डायरेक्टरी और -फाइल गेट-चाइल्ड इटेम पर भी काम करता है। सीधे PSIsContainer विशेषता का उपयोग करने की आवश्यकता नहीं है।
राउटर

(प्राप्त करें-ChildItem | {$ _ PSIsContainer।} |? चुनें नाम) .Name
जोस ओर्टेगा

195

PowerShell 3.0 में, यह सरल है:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files

33
dir, Get-ChildItem
Chip मैककॉर्मिक

1
@crashmstr क्या आप सुनिश्चित हैं? मैंने अपने PS4.0 पर जाँच की। मेरे लिए, के रूप dirमें उतारा गया था Get-ChildItem, -Directoryऔर -Fileविकल्पों ने वर्णित के रूप में काम किया। मैं आदेशों का इस्तेमाल किया echo $PSVersionTable, help dir, dir -Directoryऔर dir -Fileइस टिप्पणी को साथ आने के लिए।
पीटर हुल

3
इसका उत्तर होना चाहिए
क्रिस एस

2
lsऔर अपने जहर लेने के dirउपनाम हैंGet-ChildItem
Kolob Canyon

53

उपयोग

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

उपनिर्देशिकाओं को भी पुनर्जीवित करने के लिए, -rविकल्प जोड़ें ।

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

PowerShell 4.0, PowerShell 5.0 (Windows 10), PowerShell Core 6.0 (Windows 10, Mac और Linux) और PowerShell 7.0 (Windows 10, Mac और Linux) पर परीक्षण किया गया ।

नोट : जब आप -rस्विच निर्दिष्ट करते हैं, तो PowerShell Core पर, सीमलिंक का पालन नहीं किया जाता है । सीमलिंक का पालन करने के लिए, -FollowSymlinkस्विच को निर्दिष्ट करें -r

नोट 2 : PowerShell अब क्रॉस-प्लेटफॉर्म है, संस्करण 6.0 के बाद से। क्रॉस-प्लेटफ़ॉर्म संस्करण को मूल रूप से पावरशेल कोर कहा जाता था, लेकिन "कोर" शब्द को पावरशेल 7.0+ से हटा दिया गया है।

Get-ChildItem प्रलेखन: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem


2
यह Powershell 2.0 में काम नहीं करेगा जो ओपी की विशिष्ट आवश्यकता थी। - [/ Dir / Directory] पॉवरशेल २.० में मान्य पैरामीटर नहीं हैं
बेन पर्सिक

21

एक क्लीनर दृष्टिकोण:

Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}

मुझे आश्चर्य है कि अगर PowerShell 3.0 में एक स्विच है जो केवल निर्देशिकाओं को लौटाता है; यह जोड़ने के लिए एक तार्किक बात की तरह लगता है।


1
FYI करें 3.0 -Directory-File
शक्तियां


6

PowerShell v2 और नए से (k उस फ़ोल्डर का प्रतिनिधित्व करता है जिसे आप अपनी खोज शुरू कर रहे हैं):

Get-ChildItem $Path -attributes D -Recurse

यदि आप केवल फ़ोल्डर नाम चाहते हैं, और कुछ नहीं, तो इसका उपयोग करें:

Get-ChildItem $Path -Name -attributes D -Recurse

यदि आप एक विशिष्ट फ़ोल्डर की तलाश कर रहे हैं, तो आप निम्नलिखित का उपयोग कर सकते हैं। इस मामले में, मैं एक फ़ोल्डर की तलाश कर रहा हूं जिसका नाम है myFolder:

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"

और PS 3.0 o 4.0 का उपयोग कर रहे हैं?
किकिनेट

5
Attributes पैरामीटर PS2 में नहीं लगता है, यह एक त्रुटि देता है "एक पैरामीटर नहीं पाया जा सकता है जो पैरामीटर नाम 'Attributes" से मेल खाता है। " यह PS3 में ठीक काम करता है।
विलेकॉउ

5

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

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

यह वह है जिसका मैं उपयोग करूंगा।
डेविड बैतज़

2
और भी छोटा: ls -r | ? {$ _। मोड -match "d"}
ज्येगोरथ

यह संकुचित फ़ोल्डरों को नहीं पाता है
चार्ल्स लैम्बर्ट

7
क्योंकि एक संपीड़ित फ़ोल्डर एक ज़िप फ़ाइल है
user1594322

यह हमेशा सब कुछ पुनरावृत्ति करने के लिए उपयोगी नहीं है। आपके पास एक बहुत ही गहरा और झाड़ीदार पेड़ हो सकता है, जहाँ आप केवल निर्देशिका में रुचि रखते हैं, ठीक दो स्तरों पर; तीस स्तरों की खोज करना समय की बर्बादी है।
रॉस प्रेसर

4

उपयोग:

dir -Directory -Recurse | Select FullName

यह आपको केवल निर्देशिका के लिए फ़ोल्डर नाम के साथ रूट संरचना का आउटपुट देगा।


3

उपयोग:

Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name |  convertto-csv -NoTypeInformation  | Out-File c:\temp\mydirectorylist.csv

जो निम्न कार्य करता है

  • लक्ष्य स्थान में निर्देशिकाओं की सूची प्राप्त करें: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • केवल निर्देशिका का नाम निकालें: Select-Object -Property name
  • आउटपुट को CSV प्रारूप में बदलें: convertto-csv -NoTypeInformation
  • फ़ाइल में परिणाम सहेजें: Out-File c:\temp\mydirectorylist.csv

2
यह बहुत अच्छा होगा यदि आप प्रत्येक चरण की व्याख्या कर सकते हैं ताकि अधिक लोग देख सकें कि क्या चल रहा है।
जाजुर्रो

यह Powershell 2.0 में काम नहीं करेगा जो ओपी की विशिष्ट आवश्यकता थी। - - [/ Dir / Directory] पॉवरशेल २.० में मान्य पैरामीटर नहीं हैं
बेन पर्सिक

2

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

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

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


2

आप पहले सभी फ़ोल्डर्स और फ़ाइलों को पुन: प्राप्त करने के लिए Get-ChildItem का उपयोग करना चाहते हैं । और फिर उस आउटपुट को जहाँ- जहाँ फ़ाइल ले जाते हैं, वहाँ एक ऑब्जेक्ट-ऑब्जेक्ट क्लॉज़ में पाइप करें।

# one of several ways to identify a file is using GetType() which
# will return "FileInfo" or "DirectoryInfo"
$files = Get-ChildItem E:\ -Recurse | Where-Object {$_.GetType().Name -eq "FileInfo"} ;

foreach ($file in $files) {
  echo $file.FullName ;
}

1

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

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

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

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

यह मान मायने रखता है यदि मान स्ट्रिंग में समाप्‍त होता है:

  • बड़े Select-Objectआश्चर्य सेfoo\@{FullName=bar}
  • साथ ForEach-operator की उम्मीद:foo\bar

1
Select-Object वास्तव में PSCustomObject प्रकार की वस्तुओं को लौटाएगा। जबकि आप कच्चे तार को प्राप्त करने के लिए% (जो कि फॉर-ऑब्जेक्ट है) का उपयोग कर सकते हैं, जैसे आप भी कर सकते हैंSelect-Object -ExpandProperty FullName
जेम्सक्यूमर्फी


0

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

Get-ChildItem -Path \\server\share\folder\ -Recurse -Force | where {$_.Attributes -like '*Directory*'} | Export-Csv -Path C:\Temp\Export.csv -Encoding "Unicode" -Delimiter ";"

0

मूल प्रश्न का उत्तर देने के लिए विशेष रूप से (IO.FileAttributes का उपयोग करके):

Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}

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

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