আমি সমস্ত ফোল্ডারে একটি ফাইল অনুসন্ধান করছি।
Copyforbuild.bat
অনেক জায়গায় উপলব্ধ এবং আমি পুনরাবৃত্তি অনুসন্ধান করতে চাই।
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
আমি কীভাবে এটি পাওয়ারশেলে করতে পারি?
আমি সমস্ত ফোল্ডারে একটি ফাইল অনুসন্ধান করছি।
Copyforbuild.bat
অনেক জায়গায় উপলব্ধ এবং আমি পুনরাবৃত্তি অনুসন্ধান করতে চাই।
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
আমি কীভাবে এটি পাওয়ারশেলে করতে পারি?
উত্তর:
স্যুইচ সহ গেট-চাইল্ড আইটেম সেমিডলেট ব্যবহার করুন -Recurse
:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
এরপরেls -r -inc CopyForBuild.bat
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
আমি এটি ফাইলগুলি অনুসন্ধান করতে এবং তারপরে পাওয়ারশেলের ফলাফলগুলির পুরো পথটি প্রদর্শন করতে ব্যবহার করি:
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}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
কাজও করবে
লড়াইয়ের পরে অবশেষে যে পদ্ধতিটি নিয়ে এসেছি তা এখানে:
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
শর্টহ্যান্ড নেইএটা চেষ্টা কর:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
ফোল্ডারগুলি বাদ দিতেও ব্যবহার করতে পারেন
ওয়াইল্ডকার্ড ব্যবহার করে ফিল্টার করুন:
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' }
'\ACopyForBuild\.(bat|cmd)\Z'
?