পাওয়ারশেল ব্যবহার করে পুনরাবৃত্ত হওয়া ফাইল অনুসন্ধান


238

আমি সমস্ত ফোল্ডারে একটি ফাইল অনুসন্ধান করছি।

Copyforbuild.bat অনেক জায়গায় উপলব্ধ এবং আমি পুনরাবৃত্তি অনুসন্ধান করতে চাই।

$File = "V:\Myfolder\**\*.CopyForbuild.bat"

আমি কীভাবে এটি পাওয়ারশেলে করতে পারি?

উত্তর:


393

স্যুইচ সহ গেট-চাইল্ড আইটেম সেমিডলেট ব্যবহার করুন -Recurse:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

1
একটি সমস্যা রয়েছে বলে মনে হচ্ছে যে এটি যদি কোনও ডিরেক্টরিতে চালিত হয় তবে আপনার অ্যাক্সেসের অনুমতি নেই, পুরো অনুসন্ধানটি বাতিল হয়ে যায় কারণ প্রক্রিয়াটি প্রস্থান করে। যে কাছাকাছি একটি উপায় আছে কি?
দলিল02392

6
ত্রুটিঅ্যাকশন প্যারামিটারটি চালিয়ে বা সাইলেন্টলি কন্টিনিউতে সেট করার চেষ্টা করুন (যদি এর মানটি উল্লিখিত না হয়)।
শে লেভি

22
ঠিক একই জিনিসটি করার একটি ছোট্ট উপায়: cd V:\MyFolderএরপরেls -r -inc CopyForBuild.bat
অরিয়ন এডওয়ার্ডস

8
সুতরাং উপরোক্ত মন্তব্যকারীদের অর্থ কী ...ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
অ্যান্ড্রু

আমি এই উত্তরটি *ফাইল নামের শেষে অ্যাস্ট্রিক চিহ্ন ( ) যুক্ত করে আংশিক স্ট্রিংয়ের জন্য রূপান্তর করেছি । ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"LINE2: $Folder = "C:\Program Files"LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
SherlockSpreadsheets

37

আমি এটি ফাইলগুলি অনুসন্ধান করতে এবং তারপরে পাওয়ারশেলের ফলাফলগুলির পুরো পথটি প্রদর্শন করতে ব্যবহার করি:

dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}

আপনি সর্বদা ওয়াইল্ডকার্ড ব্যবহার করতে পারেন *মধ্যে FolderNameএবং / অথবা FileName.fileExtension। উদাহরণ স্বরূপ:

dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}

উপরের উদাহরণটি C:\শব্দটি দিয়ে ড্রাইভের যে কোনও ফোল্ডার সন্ধান করবে Folder। সুতরাং আপনার যদি নামে একটি ফোল্ডার থাকে FolderFooএবং FolderBarপাওয়ারশেল those উভয় ফোল্ডারের ফলাফল দেখায়।

ফাইলের নাম এবং ফাইল এক্সটেনশনের ক্ষেত্রেও একই কাজ। আপনি যদি একটি নির্দিষ্ট এক্সটেনশন সহ কোনও ফাইল অনুসন্ধান করতে চান তবে ফাইলটির নাম জানেন না তবে আপনি ব্যবহার করতে পারেন:

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}

অথবা উলটা:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}

4
আমি এই উত্তরটিকে অত্যন্ত দরকারী বলে মনে করি কারণ এটি একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে সম্বোধন করে - বাস্তবে আপনি যে ফাইলটি সন্ধান করছেন তা ব্যবহার করতে চান। | | আপনাকে দেওয়া ফাইলটির পুরো নামটি অন্য উত্তরের মধ্যে কিছু হারিয়ে যাচ্ছে।
নিউটেক বিকাশকারী 15

1
আমাকে এখানে @ স্যানিটি 1123 এর সাথে একমত হতে হবে, আপনি যদি প্রকৃতপক্ষে ফাইলটি ব্যবহার করতে চান তবে আপনার ফাইলটির পুরো পথের প্রয়োজন হবে। আইএমএইচও এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
uceumern

31

সুরক্ষা (উদাহরণস্বরূপ C:\Users) এর উপর ভিত্তি করে যেখানে আপনি কোনও ত্রুটি পেতে পারেন এমন ফোল্ডারগুলি অনুসন্ধান করার সময়, নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

12
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

কাজও করবে


এবং যদি আপনি কোনও ফাইলে ফলাফল আউটপুট করতে চান তবে আপনি কমান্ডের শেষে `> path_to_filename.txt` যুক্ত করতে পারেন।
Gwen আউ

7

লড়াইয়ের পরে অবশেষে যে পদ্ধতিটি নিয়ে এসেছি তা এখানে:

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*

আউটপুট ক্লিনার করতে (কেবলমাত্র পাথ), ব্যবহার করুন:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname

শুধুমাত্র প্রথম ফলাফল পেতে, ব্যবহার করুন:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1

এখন গুরুত্বপূর্ণ জিনিসগুলির জন্য:

কেবল ফাইল / ডিরেক্টরি অনুসন্ধান করার জন্য ব্যবহার করবেন না-File বা -Directory(কেন নীচে দেখুন)। পরিবর্তে এটি ফাইলের জন্য ব্যবহার করুন:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

এবং -eq $falseডিরেক্টরি জন্য সরান । পছন্দসই ওয়াইল্ডকার্ডটি ছেড়ে যাবেন নাbin/*

স্যুইচ ইন বিল্ট ব্যবহার করবেন না কেন? এগুলি ভয়ানক এবং এলোমেলোভাবে বৈশিষ্ট্যগুলি সরিয়ে দেয়। উদাহরণস্বরূপ, -Includeকোনও ফাইল ব্যবহার করার জন্য আপনাকে অবশ্যই ওয়াইল্ডকার্ড দিয়ে পথটি শেষ করতে হবে। তবে -Recurseএটি আপনাকে না বলে সুইচটি অক্ষম করে :

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib

আপনি ভাবেন যে এটি আপনাকে *.libসমস্ত উপ-ডিরেক্টরিতে সমস্ত দেবে, তবে এটি কেবল শীর্ষ স্তরের অনুসন্ধান করবেbin

ডিরেক্টরি অনুসন্ধান করার জন্য, আপনি ব্যবহার করতে পারেন -Directory, তবে তারপরে আপনাকে অবশ্যই চলমান ওয়াইল্ডকার্ডটি সরিয়ে ফেলতে হবে। যে কারণেই হোক না কেন, এটি নিষ্ক্রিয় হবে না-Recurse । এই কারণগুলির জন্যই আমি বিল্টিন ফ্ল্যাগগুলি ব্যবহার না করার প্রস্তাব দিই।

আপনি এই আদেশটি যথেষ্ট সংক্ষিপ্ত করতে পারেন:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

হয়ে

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem থেকে aliised হয় gci
  • -Path 0 পজিশনে ডিফল্ট, সুতরাং আপনি কেবল প্রথম আর্গুমেন্টের পথ তৈরি করতে পারেন
  • -Recurse থেকে aliised হয় -s
  • -Include শর্টহ্যান্ড নেই
  • নাম / পাথের ফাঁকির জন্য একক উদ্ধৃতি ব্যবহার করুন, যাতে আপনি ডাবল উদ্ধৃতি সহ পুরো কমান্ডটি ঘিরে রাখতে পারেন এবং এটি কমান্ড প্রম্পটে ব্যবহার করতে পারেন। এটি অন্য উপায়ে চারপাশে করা (একক উদ্ধৃতি দিয়ে চারপাশে) ত্রুটি ঘটায়

6

এটা চেষ্টা কর:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}

2
আপনি | Where-Object { !$_PSIsContainer }ফোল্ডারগুলি বাদ দিতেও ব্যবহার করতে পারেন
গারগ্র্যাভার

5

ওয়াইল্ডকার্ড ব্যবহার করে ফিল্টার করুন:

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse

নিয়মিত এক্সপ্রেশন ব্যবহার করে ফিল্টারিং:

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }

1
এটা করা উচিত নয় '\ACopyForBuild\.(bat|cmd)\Z'?
ই সুন্দিন

1

@ User3303020 উত্তর যুক্ত করতে এবং অনুসন্ধানের ফলাফলগুলিকে একটি ফাইলে আউটপুট করতে আপনি চালাতে পারেন

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt

সেভাবে সঠিক ফাইলটি অনুসন্ধান করা আরও সহজ হতে পারে।

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