PowerShell कॉपी स्क्रिप्ट में कई स्ट्रिंग्स को ठीक से कैसे करें


80

मैं एक फाइल कॉपी करने के लिए इस उत्तर से PowerShell स्क्रिप्ट का उपयोग कर रहा हूं । समस्या तब होती है जब मैं फ़िल्टर का उपयोग करके कई फ़ाइल प्रकारों को शामिल करना चाहता हूं।

Get-ChildItem $originalPath -filter "*.htm"  | `
   foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); ` 
 New-Item -ItemType File -Path $targetFile -Force;  `
 Copy-Item $_.FullName -destination $targetFile }

एक सपने की तरह काम करता है। हालाँकि, समस्या तब उत्पन्न होती है जब मैं फ़िल्टर का उपयोग करके कई फ़ाइल प्रकारों को शामिल करना चाहता हूं।

Get-ChildItem $originalPath ` 
  -filter "*.gif","*.jpg","*.xls*","*.doc*","*.pdf*","*.wav*",".ppt*")  | `
   foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); ` 
 New-Item -ItemType File -Path $targetFile -Force;  `
 Copy-Item $_.FullName -destination $targetFile }

मुझे निम्नलिखित त्रुटि देता है:

Get-ChildItem : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Filter'. Specified method is not supported.
At F:\data\foo\CGM.ps1:121 char:36
+ Get-ChildItem $originalPath -filter <<<<  "*.gif","*.jpg","*.xls*","*.doc*","*.pdf*","*.wav*",".ppt*" | `
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.GetChildItemCommand

मेरे पास कोष्ठक के विभिन्न पुनरावृत्तियाँ हैं, कोई कोष्ठक नहीं हैं, और -filter, -includeचर (जैसे, $fileFilter) के रूप में समावेशन को परिभाषित करते हुए और हर बार उपरोक्त त्रुटि प्राप्त करते हैं, और हमेशा जो कुछ भी इंगित करता है -filter

दिलचस्प है कि जब मैं कोड -filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*"। कोई त्रुटि नहीं है, लेकिन मैं और कोई परिणाम नहीं मिलता है और कंसोल पर वापस कुछ भी नहीं है। मुझे संदेह है कि मैंने अनजाने में andउस बयान के साथ एक कोडित किया है?

तो मैं क्या गलत कर रहा हूं, और मैं इसे कैसे सही कर सकता हूं?

जवाबों:


194

-फिल्टर केवल एक ही स्ट्रिंग को स्वीकार करता है। -Include कई मानों को स्वीकार करता है, लेकिन -Path तर्क को योग्य बनाता है। चाल संलग्न करने के लिए है \*पथ के अंत करने के लिए, और उसके बाद का उपयोग -Include कई एक्सटेंशन का चयन करें। BTW, स्ट्रिंग्स को उद्धृत करना cmdlet तर्कों में अनावश्यक है जब तक कि उनमें रिक्त स्थान या शेल विशेष वर्ण न हों।

Get-ChildItem $originalPath\* -Include *.gif, *.jpg, *.xls*, *.doc*, *.pdf*, *.wav*, .ppt*

ध्यान दें कि यह इस बात पर ध्यान दिए बिना काम करेगा कि $ मूलपाठ बैकस्लैश में समाप्त होता है या नहीं, क्योंकि एक ही पथ विभाजक के रूप में कई लगातार बैकस्लैश की व्याख्या की जाती है। उदाहरण के लिए, कोशिश करें:

Get-ChildItem C:\\\\\Windows

5
वू हू! इस \*ट्रिक ने सिर्फ छह समस्याओं का हल निकाला है। बहुत अच्छे धन्यवाद!
dwwilson66

17
ध्यान दें कि निर्दिष्ट किए जाने पर वाइल्डकार्ड ( \*) की आवश्यकता नहीं -Recurseहै।
ओहद श्नाइडर

किसी कारण के लिए यह काम नहीं करता है जब निर्देशिका के लिए खोज?
रॉस प्रेसर

जोड़ना -Recurse इसे सब-फोल्डर तक पहुंचने की अनुमति देता है
डेरेक एवरमोर

2

ऐसा कुछ काम करना चाहिए (यह मेरे लिए किया)। इसके -Filterबजाय उपयोग करने की इच्छा के कारण -Includeइसमें शामिल एक विशाल प्रदर्शन हिट होता है -Filter

नीचे प्रत्येक फ़ाइल प्रकार और एकाधिक सर्वर / वर्कस्टेशन को अलग-अलग फाइलों में निर्दिष्ट किया गया है।

##  
##  This script will pull from a list of workstations in a text file and search for the specified string


## Change the file path below to where your list of target workstations reside
## Change the file path below to where your list of filetypes reside

$filetypes = gc 'pathToListOffiletypes.txt'
$servers = gc 'pathToListOfWorkstations.txt'

##Set the scope of the variable so it has visibility
set-variable -Name searchString -Scope 0
$searchString = 'whatYouAreSearchingFor'

foreach ($server in $servers)
    {

    foreach ($filetype in $filetypes)
    {

    ## below creates the search path.  This could be further improved to exclude the windows directory
    $serverString = "\\"+$server+"\c$\Program Files"


    ## Display the server being queried
    write-host “Server:” $server "searching for " $filetype in $serverString

    Get-ChildItem -Path $serverString -Recurse -Filter $filetype |
    #-Include "*.xml","*.ps1","*.cnf","*.odf","*.conf","*.bat","*.cfg","*.ini","*.config","*.info","*.nfo","*.txt" |
    Select-String -pattern $searchstring | group path | select name | out-file f:\DataCentre\String_Results.txt

    $os = gwmi win32_operatingsystem -computer $server
    $sp = $os | % {$_.servicepackmajorversion}
    $a = $os | % {$_.caption}

    ##  Below will list again the server name as well as its OS and SP
    ##  Because the script may not be monitored, this helps confirm the machine has been successfully scanned
        write-host $server “has completed its " $filetype "scan:” “|” “OS:” $a “SP:” “|” $sp


    }

}
#end script

यह बहुत सही है और 5 ऐसे ही सवालों के जवाब में यहां किसी ने -filter *.jpg, *.pngयह नहीं बताया कि हालांकि हम ऐसा नहीं कर सकते हैं, फिर भी * doilfilter * .jpg को एक ही बार में तेज कर सकते हैं, do -filter * .png की तुलना में और परिणामों में शामिल हों। एक करो -Include *.jpg, *.png"। मेरे पास एक फ़ोल्डर है जिसमें 126k फाइलें और 18k फ़ोल्डर हैं। मैं प्रत्येक फ़ोल्डर में एक फ़ाइल और एक फ़ोल्डर की खोज कर रहा हूँ। का उपयोग कर -Filter 5sec और उपयोग -Include 30secs लेता है। डूइंग -फिल्टर दो बार 10secs में तीन गुना तेजी से एक-बार जाना है।
पापो

0
Get-ChildItem $originalPath\* -Include @("*.gif", "*.jpg", "*.xls*", "*.doc*", "*.pdf*", "*.wav*", "*.ppt")

ढेर अतिप्रवाह में आपका स्वागत है! यह उत्तर कम गुणवत्ता की समीक्षा कतार में बदल गया, संभवतः क्योंकि आपने सामग्री की व्याख्या नहीं की थी। यदि आप इसे (अपने उत्तर में) समझाते हैं, तो आप अधिक उत्थान प्राप्त करने की संभावना रखते हैं - और प्रश्नकर्ता वास्तव में कुछ सीखता है!
द गॉट विद द हट

2
इसके अलावा, यह मेरे द्वारा पहले पोस्ट किए गए उत्तर से कोड को दोहराता है, सिवाय इसके कि यह एक एक्सप्रेशन एक्सप्रेशन मूल्यांकन ऑपरेटर ( @()) में एक्सटेंशन की सूची को संलग्न करता है , जो कि अतिश्योक्तिपूर्ण है, क्योंकि अल्पविराम से अलग की गई सूची का एक सरणी के रूप में स्वाभाविक मूल्यांकन किया जाता है।
आदि इनबार

-2

शामिल का उपयोग प्रति के रूप में सबसे आसान तरीका है

http://www.vistax64.com/powershell/168315-get-childitem-filter-files-multiple-extensions.html


1
यह काम नहीं किया। :( -filter -include *.file, *.types -filter -include (*.file, *.types), -filter -include "*.file", "*.types"और -filter -include ("*.file", "*.types")मेरे प्रश्न के अनुसार सभी त्रुटिपूर्ण हैं। -filterपैरामीटर को खत्म करना और बस -include(उद्धरणों और परगनों के एक ही पुनरावृत्तियों) को शामिल करने से रनटाइम त्रुटियों का परिणाम नहीं निकला , लेकिन गंतव्य निर्देशिका में कोई परिणाम सेट नहीं किया गया था।
dililson66
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.