我正在尝试获取目录中所有 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()
}