2013-09-04 3 views
51

में कई स्ट्रिंग्स को ठीक से कैसे ठीक करें फ़ाइल फ़ाइल कॉपी करने के लिए मैं this answer से PowerShell स्क्रिप्ट का उपयोग कर रहा हूं। समस्या उत्पन्न होती है जब मैं फ़िल्टर का उपयोग कर एकाधिक फ़ाइल प्रकारों को शामिल करना चाहता हूं।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 : 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) और हर बार ऊपर मिलती है:

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 } 

मुझे निम्न त्रुटि देता है त्रुटि, और हमेशा -filter का पालन करने के लिए इंगित करता है।

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

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

उत्तर

112

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

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

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

Get-ChildItem C:\\\\\Windows 
+2

वूहू! कि '\ *' चाल ने अभी तक लगभग छह समस्याएं हल की हैं। बहुत बढ़िया और धन्यवाद! – dwwilson66

+2

बहुत बढ़िया, कि \\ * चाल ने मेरा बनाया है सप्ताह। –

+8

ध्यान दें कि '-रिक्सर' निर्दिष्ट होने पर वाइल्डकार्ड ('\ *') की आवश्यकता नहीं है। –

-1

का प्रयोग करें में शामिल प्रति

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

+1

कि काम नहीं किया। :('-फिल्टर-शामिल * .file, * .types'' -filter- शामिल करें (* .file, * .types) ', '-फिल्टर-शामिल करें" * .file "," * .types "', और '-फिल्टर-शामिल करें (" * .file "," * .types ") 'उपरोक्त मेरे प्रश्न के अनुसार सभी अनियमित हैं।' -फिल्टर 'पैरामीटर को हटाएं और बस' शामिल करें '(उद्धरण और माता-पिता के समान पुनरावृत्तियों) _runtime_ त्रुटियों का नतीजा नहीं हुआ, लेकिन गंतव्य निर्देशिका में कोई परिणाम सेट नहीं हुआ। – dwwilson66

0

ऐसा कुछ काम करना चाहिए (यह मेरे लिए किया गया था)। -Include के बजाय -Filter का उपयोग करने का कारण यह है कि -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 *.txt | 
    #-Include "*.xml","*.ps1","*.cnf","*.odf","*.conf","*.bat","*.cfg","*.ini","*.config","*.info","*.nfo","*.txt" | 
    Select-String -pattern 'cifs01' | 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 
-4
Get-ChildItem $originalPath\* -Include @("*.gif", "*.jpg", "*.xls*", "*.doc*", "*.pdf*", "*.wav*", "*.ppt") 
+0

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

+2

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