How to properly -filter multiple strings in a PowerShell copy script
copy, filter, powershell, powershell-2.0
Solution
-Filter only accepts a single string. -Include accepts multiple values, but qualifies the -Path argument. The trick is to append `\*` to the end of the path, and then use -Include to select multiple extensions. BTW, quoting strings is unnecessary in cmdlet arguments unless they contain spaces or shell special characters.
Get-ChildItem $originalPath\* -Include *.gif, *.jpg, *.xls*, *.doc*, *.pdf*, *.wav*, .ppt*
Note that this will work regardless of whether $originalPath ends in a backslash, because multiple consecutive backslashes are interpreted as a single path separator. For example, try:
Get-ChildItem C:\\\\\Windows
Problem
I am using the PowerShell script from this answer to do a file copy. The problem arises when I want to include multiple file types using the filter. ``` Get-ChildItem $originalPath -filter "*.htm" | ` foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); ` New-Item -ItemType File -Path $targetFile -Force; ` Copy-Item $_.FullName -destination $targetFile } ``` works like a dream. However, The problem arises when I want to include multiple file types using the filter. ``` 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 } ``` Gives me the following error: ``` 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 ``` I have various iterations of parentheses, no parentheses, `-filter`, `-include`, defining the inclusions as variable (e.g., `$fileFilter`) and each time get the above error, and always pointing to whatever follows `-filter`. The interesting exception to that is when I code `-filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*"`. There are no errors, but I and get no results and nothing back to the console. I suspect I've inadvertently coded an impicit `and` with that statement? So what am I doing wrong, and how can I correct it?