如何让 get-childitem 过滤多种文件类型?

如何让 get-childitem 过滤多种文件类型?

我正在尝试获取目录中所有 XSL 和 XSLT 文件的列表。

dir -recurse -filter *.xsl,*.xslt -name

但出现以下错误:

Get-ChildItem:无法将“System.Object[]”转换为参数“Filter”所需的类型“System.String”。不支持指定的方法。

dir -recurse -filter *.xsl -filter *.xslt -name

但出现此错误:

Get-ChildItem:无法绑定参数,因为参数“Filter”指定了多次。要为可以接受多个值的参数提供多个值,请使用数组语法。例如,“-parameter value1,value2,value3”。

我可以用一个命令列出两个文件扩展名吗?

答案1

dir .\* -include ('*.xsl', '*.xslt') -recurse

答案2

我不知道为什么,但这一个似乎是快多了

dir .\ -recurse | where {$_.extension -in ".xsl",".xslt"}

答案3

“过滤器”*.xsl*.xslt可以是路径参数的一部分。路径采取一个字符串数组:

Set-Location c:\topLevel
gci *.xsl, *.xslt -Recurse

如果要指定当前位置以外的路径,或搜索多个位置,请创建几个字符串数组并使用Join-Path创建路径数组:

PS C:\> $paths   = 'c:\topLevel' , 'd:\topLevel'
PS C:\> $filters = '*.xsl' , '*.xslt'
PS C:\> $filters | ForEach-Object { Join-Path $paths $_ }
c:\topLevel\*.xsl
d:\topLevel\*.xsl
c:\topLevel\*.xslt
d:\topLevel\*.xslt
PS C:\>

该输出可以通过管道传输到 Get-ChildItem:

$paths   = 'c:\topLevel' , 'd:\topLevel'
$filters = '*.xsl' , '*.xslt'
$filters | % { Join-Path $paths $_ } | gci -name

额外提示:

如果您不需要 FileInfo 对象的附加属性,而只需要一个完全限定路径的列表,Resolve-Path是比较快的:

$paths   = 'c:\topLevel' , 'd:\topLevel'
$filters = '*.xsl' , '*.xslt'
$filters | % { Join-Path $paths $_ } | Resolve-Path

我的快速测试:

PS C:\>Measure-Command { $filters | % { Join-Path $path $_ } | gci | select -expand FullName }

...
TotalMilliseconds : 31.2376



PS C:\>Measure-Command { $filters | % { Join-Path $path $_ } | Resolve-Path }

...
TotalMilliseconds : 12.2536

答案4

这已经是老问题了,但是它帮助我编写了这个脚本来更新桌面和/或收藏的快捷方式中的 URL,所以我想分享一下:

foreach ($link in GCI "$env:USERPROFILE\Desktop" | Where-Object {$_.extension -in '.lnk','.url'}) {
   $shell = New-Object -COM WScript.Shell
   $shortcut = $shell.CreateShortcut($link.FullName)
   $shortcut.TargetPath = $shortcut.TargetPath -replace "old-url.com","new-url.com"
   $shortcut.Save()
}

foreach ($link in GCI "$env:USERPROFILE\Favorites" | Where-Object {$_.extension -in '.lnk','.url'}) {
   $shell = New-Object -COM WScript.Shell
   $shortcut = $shell.CreateShortcut($link.FullName)
   $shortcut.TargetPath = $shortcut.TargetPath -replace "old-url.com","new-url.com"
   $shortcut.Save()
}

相关内容