मैं सभी फ़ोल्डरों में एक फाइल खोज रहा हूं।
Copyforbuild.bat
कई स्थानों पर उपलब्ध है, और मैं पुनरावर्ती खोज करना चाहूंगा।
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
मैं इसे PowerShell में कैसे कर सकता हूं?
मैं सभी फ़ोल्डरों में एक फाइल खोज रहा हूं।
Copyforbuild.bat
कई स्थानों पर उपलब्ध है, और मैं पुनरावर्ती खोज करना चाहूंगा।
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
मैं इसे PowerShell में कैसे कर सकता हूं?
जवाबों:
का प्रयोग करें प्राप्त-ChildItem साथ cmdlet -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*"
लाइन 2: $Folder = "C:\Program Files"
लाइन 3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
मैं फ़ाइलों को खोजने के लिए इसका उपयोग करता हूं और फिर PowerShell को परिणामों के पूरे पथ को प्रदर्शित करता हूं:
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
PowerShell उन दोनों फ़ोल्डरों से परिणाम दिखाएगा।
वही फ़ाइल नाम और फ़ाइल एक्सटेंशन के लिए जाता है। यदि आप एक निश्चित एक्सटेंशन के साथ एक फ़ाइल की खोज करना चाहते हैं, लेकिन फ़ाइल का नाम नहीं जानते हैं, तो आप इसका उपयोग कर सकते हैं:
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
को अलियास किया जाता है gci
-Path
स्थिति 0 के लिए डिफ़ॉल्ट है, इसलिए आप केवल पहला तर्क पथ बना सकते हैं-Recurse
को अलियास किया जाता है -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'
?