গেট-চাইল্ড আইটেম ব্যবহার করে আমি কীভাবে কেবল ডিরেক্টরিগুলি পাই?


242

আমি পাওয়ারশেল ২.০ ব্যবহার করছি এবং আমি একটি নির্দিষ্ট পাথের সমস্ত উপ-ডিরেক্টরিটি পাইপ করতে চাই out নিম্নলিখিত কমান্ডটি সমস্ত ফাইল এবং ডিরেক্টরিকে আউটপুট করে তবে আমি কীভাবে ফাইলগুলি ফিল্টার করব তা অনুভব করতে পারি না।

Get-ChildItem c:\mypath -Recurse

আমি $_.Attributesবৈশিষ্ট্যগুলি ব্যবহার করার চেষ্টা করেছি কিন্তু তারপরে System.IO.FileAttributesতুলনা করার জন্য কীভাবে আক্ষরিক উদাহরণ তৈরি করব তা আমি জানি না । ইন cmd.exeএটি হবে

dir /b /ad /s

উত্তর:


292

পাওয়ারশেল সংস্করণের জন্য 3.0 এরও কম:

দ্বারা FileInfoপ্রত্যাবর্তিত বস্তুর Get-ChildItemএকটি "বেস" বৈশিষ্ট্য রয়েছে PSIsContainer,। আপনি কেবল সেই আইটেমগুলি নির্বাচন করতে চান।

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

আপনি যদি ডিরেক্টরিগুলির কাঁচা স্ট্রিংয়ের নাম চান তবে আপনি এটি করতে পারেন

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

পাওয়ারশেল 3.0.০ এবং এর চেয়ে বেশি জন্য:

dir -Directory

20
"ইশফোল্ডার" এর সাথে আলিয়াস করা হয়েছে এমন কামনা করুন।
xcud

5
এক্সকুড: পিএসডিআরাইভ দ্বারা প্রতিনিধিত্ব করা প্রতিটি শ্রেণিবিন্যাস ফোল্ডার-ভিত্তিক নয়।
জোয়

10
"ধারক" এবং "ফোল্ডার" এর মধ্যে অর্থপূর্ণ ব্যবধানটি আপনি ট্রাক চালাতে পারবেন না।
xcud

5
@ এক্সকড: ইরাসেনথিলের উত্তর দেখুন। -ডাইরেক্টরি এবং -ফাইলে গেট-চাইল্ড আইটেমেও কাজ করে। সরাসরি PSIsContainer গুণাবলী ব্যবহার করার দরকার নেই।
ওয়াউটার

(গেট-চাইল্ড আইটেম |? {$ _। PSIsContainer} | নাম নির্বাচন করুন)। নাম
জোসে অরতেগা

195

পাওয়ারশেল 3.0.০ এ এটি সহজ:

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

33
দির গেট-চাইল্ড আইটেমের একটি নাম
চিপ

1
আপনি কি নিশ্চিত? আমি আমার PS4.0 এ চেক করেছি। আমার জন্য, dirএ্যালিজড ছিল Get-ChildItem, -Directoryএবং -Fileবিকল্পগুলি বর্ণিত হিসাবে কাজ করেছে। আমি কমান্ড ব্যবহৃত echo $PSVersionTable, help dir, dir -Directoryএবং dir -Fileএই মন্তব্যটি নিয়ে আসা।
পিটার হাল

3
এটি উত্তর হওয়া উচিত
ক্রিস এস

2
lsএবং dirএর alias লেখা হয় Get-ChildItemআপনার বিষ বাছাই
Kolob ক্যানিয়ন

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 

পাওয়ারশেল ৪.০, পাওয়ারশেল ৫.০ (উইন্ডোজ 10), পাওয়ারশেল কোর .0.০ (উইন্ডোজ 10, ম্যাক এবং লিনাক্স), এবং পাওয়ারশেল .0.০ (উইন্ডোজ 10, ম্যাক এবং লিনাক্স) এ পরীক্ষিত ।

দ্রষ্টব্য : পাওয়ারশেল কোর-এ, আপনি -rস্যুইচটি নির্দিষ্ট করার সময় সিমলিঙ্কগুলি অনুসরণ করা হয় না । প্রতিলিঙ্কগুলি অনুসরণ করতে, -FollowSymlinkসাথে স্যুইচটি নির্দিষ্ট করুন -r

দ্রষ্টব্য 2 : সংস্করণ 6.0 থেকে পাওয়ারশেল এখন ক্রস প্ল্যাটফর্ম। ক্রস-প্ল্যাটফর্ম সংস্করণটি প্রথমে পাওয়ারশেল কোর নামে পরিচিত, তবে পাওয়ার শেল 7.0+ থেকে "কোর" শব্দটি বাদ দেওয়া হয়েছে।

গেট-চাইল্ড আইটেম ডকুমেন্টেশন: https://docs.microsoft.com/en-us/powershell/module/mic Microsoft.powershell.management/get-childitem


2
এটি পাওয়ারশেল 2.0 তে কাজ করবে না যা ওপির নির্দিষ্ট প্রয়োজন ছিল need - [/ দির / ডিরেক্টরি] পাওয়ারশেল ২.০
বেন পারসোনিক

21

একটি পরিষ্কার পদ্ধতি:

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

আমি অবাক হই যদি পাওয়ারশেল ৩.০-তে এমন একটি স্যুইচ থাকে যা কেবল ডিরেক্টরিগুলি দেয়; এটি যুক্ত করার মতো যৌক্তিক জিনিস বলে মনে হচ্ছে।


1
এফওয়াইআই পাওয়ারশেল 3.0 -Directoryএবং -Fileপতাকাগুলি যুক্ত করেছে
উইকিনিলিয়ামস


6

পাওয়ারশেল ভি 2 এবং আরও নতুন থেকে (কে ফোল্ডারের প্রতিনিধিত্ব করে যা আপনি নিজের সন্ধান শুরু করছেন):

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
বৈশিষ্ট্যগুলির প্যারামিটার পিএস 2-তে মনে হয় না, এটি একটি ত্রুটি দেয় "প্যারামিটারটি পাওয়া যায় না যে প্যারামিটারের নাম 'অ্যাট্রিবিউটস' এর সাথে মেলে"। এটি PS3 এ ঠিক আছে।
উইলকাউ

5

এই পদ্ধতির সাথে কম পাঠ্য প্রয়োজন:

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

এটি আমি ব্যবহার করব।
ডেভিড বেটজ

2
এমনকি ছোট: ls -r | ? {$ _। মোড-ম্যাচ "d"}
জাইগোরথ

এটি সংকুচিত ফোল্ডারগুলি খুঁজে পায় না
চার্লস ল্যামবার্ট

7
কারণ একটি সংকুচিত ফোল্ডারটি একটি জিপ ফাইল
5153 এ ব্যবহারকারী 1594322

সবসময় সর্বদা পুনরুক্তি করা কার্যকর নয়। আপনার কাছে অত্যন্ত গভীর এবং ঝোপঝাড় গাছ থাকতে পারে যেখানে আপনি কেবল দুটি স্তরের নীচে ডিরেক্টরিতে আগ্রহী; ত্রিশ স্তর নীচে অনুসন্ধান করা সময়ের অপচয় waste
রস প্রেসার

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
  • আউটপুটটিকে সিএসভি ফর্ম্যাটে রূপান্তর করুন: convertto-csv -NoTypeInformation
  • ফলাফল একটি ফাইলে সংরক্ষণ করুন: Out-File c:\temp\mydirectorylist.csv

2
আপনি প্রতিটি পদক্ষেপটি ব্যাখ্যা করতে পারলে দুর্দান্ত হবে যাতে আরও লোকেরা কী চলছে তা দেখতে পারে।
jazzurro

এটি পাওয়ারশেল 2.0 তে কাজ করবে না যা ওপির নির্দিষ্ট প্রয়োজন ছিল need - [/ দির / ডিরেক্টরি] পাওয়ারশেল ২.০
বেন পারসোনিক

2

নীচের স্ক্রিপ্টটি দিয়ে কিছুটা বেশি পঠনযোগ্য এবং সহজ পদ্ধতি অর্জন করা যেতে পারে:

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

আশাকরি এটা সাহায্য করবে!


2

আপনি পুনরাবৃত্তভাবে সমস্ত ফোল্ডার এবং ফাইলগুলি প্রথমে পেতে গেট-চাইল্ড আইটেমটি ব্যবহার করতে চাইবেন । এবং তারপরে সেই আউটপুটটিকে একটি হু-অবজেক্ট ক্লোজে পাইপ করুন যা কেবল ফাইলগুলি নিয়ে যায়।

# 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-Objectsuprisinglyfoo\@{FullName=bar}
  • ForEachপ্রত্যাশিত-সহকারীর সাথে :foo\bar

1
সিলেক্ট-অবজেক্টটি আসলে PSCustomObject টাইপের অবজেক্টগুলিকে ফিরিয়ে দেবে। আপনি যেমন নিজের মতো কাঁচা স্ট্রিং পেতে% (যা ফরইচ-অবজেক্ট) ব্যবহার করতে পারেন, আপনি তাও ব্যবহার করতে পারেনSelect-Object -ExpandProperty FullName
জেমসকিউ মুরফি

1

আমার সমাধানটি টেকনেট নিবন্ধের উপর ভিত্তি করে মজা জিনিসগুলি আপনি গেট-চাইল্ড আইটেম সিএমডলেট দিয়ে করতে পারেন

Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}

আমি এটি আমার স্ক্রিপ্টে ব্যবহার করেছি এবং এটি ভালভাবে কাজ করে।


0

এটি ব্যবহার করুন:

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

0

মূল প্রশ্নের উত্তরটি নির্দিষ্টভাবে (আইও.ফাইএলঅ্যাট্রিবিউটগুলি ব্যবহার করে):

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

আমি যদিও মারেকের সমাধানটি পছন্দ করি না ( Where-Object { $_ -is [System.IO.DirectoryInfo] })।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.