PowerShell का उपयोग करके पुनरावर्ती फ़ाइल खोज


238

मैं सभी फ़ोल्डरों में एक फाइल खोज रहा हूं।

Copyforbuild.bat कई स्थानों पर उपलब्ध है, और मैं पुनरावर्ती खोज करना चाहूंगा।

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

मैं इसे PowerShell में कैसे कर सकता हूं?

जवाबों:


393

का प्रयोग करें प्राप्त-ChildItem साथ cmdlet -Recurseस्विच:

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

1
ऐसा लगता है कि अगर यह एक निर्देशिका में चलता है, तो आपको एक्सेस करने की अनुमति नहीं है, प्रक्रिया पूरी होने के बाद पूरी खोज निरस्त हो जाती है। क्या इसके आसपास कोई रास्ता है?
deed02392

6
जारी रखने या चुपचाप करने के लिए ErrorAction पैरामीटर सेट करने का प्रयास करें (यदि इसका मूल्य उल्लेख नहीं किया गया है)।
शाय लेवी

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*"लाइन 2: $Folder = "C:\Program Files"लाइन 3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
SherlockSpreadsheets

37

मैं फ़ाइलों को खोजने के लिए इसका उपयोग करता हूं और फिर PowerShell को परिणामों के पूरे पथ को प्रदर्शित करता हूं:

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

आप हमेशा और / या *में वाइल्डकार्ड का उपयोग कर सकते हैं । उदाहरण के लिए:FolderNameFileName.fileExtension

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

उपरोक्त उदाहरण C:\शब्द के साथ शुरू होने वाले ड्राइव में किसी भी फ़ोल्डर को खोजेगा Folder। तो अगर आपके पास नाम का फोल्डर है FolderFooऔरFolderBar PowerShell उन दोनों फ़ोल्डरों से परिणाम दिखाएगा।

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

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

या ठीक इसके विपरीत:

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

4
मुझे यह उत्तर अत्यंत उपयोगी लगता है क्योंकि यह एक विशेष उपयोग के मामले को संबोधित करता है - वास्तव में उस फ़ाइल का उपयोग करना चाहता है जिसे आप खोज रहे हैं। | आपको फ़ाइल का पूरा नाम देने के लिए अन्य उत्तरों में कुछ गायब है।
न्यूटेक डेवलपर

1
मुझे यहाँ @ Sanity1123 से सहमत होना होगा, यदि आप वास्तव में फ़ाइल का उपयोग करना चाहते हैं, तो आपको फ़ाइल के लिए पूर्ण पथ की आवश्यकता होगी। IMHO यह स्वीकृत उत्तर होना चाहिए।
omeumern

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` जोड़ सकते हैं।
ग्वेन

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 को अलियास किया जाता है gci
  • -Path स्थिति 0 के लिए डिफ़ॉल्ट है, इसलिए आप केवल पहला तर्क पथ बना सकते हैं
  • -Recurse को अलियास किया जाता है -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

इस तरह से सही फ़ाइल खोजना आसान हो सकता है।

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