35

我想递归地获取路径中的文件列表(实际上是文件数),不包括某些类型:

Get-ChildItem -Path $path -Recurse | ? { $_.Name -notlike "*.cs" -and $_.Name -notlike "*.tt" }

但我有一长串排除项(仅举几例):

@("*.cs", "*.tt", "*.xaml", "*.csproj", "*.sln", "*.xml", "*.cmd", "*.txt")

如何使用此表单获取列表:

Get-ChildItem -Path $path -Recurse | ? { <# what to put here ?#> }

?

4

5 回答 5

50

这也有效:

get-childitem $path -recurse -exclude *.cs,*.tt,*.xaml,*.csproj,*.sln,*.xml,*.cmd,*.txt

请注意,-include 仅适用于路径中的 -recurse 或通配符。(实际上它在 6.1 pre 2 中一直有效)

另请注意,如果路径中没有 -recurse 或通配符,同时使用 -exclude 和 -filter 将不会列出任何内容。

-include 和 -literalpath 在 PS 5 中似乎也有问题。

还有一个带有 -include 和 -exclude 的错误,根目录 "\" 的路径不显示任何内容。在 unix 中它给出了一个错误。

于 2016-11-28T17:18:28.730 回答
33

您可以Get-ChildItem使用-exclude参数提供排除项:

$excluded = @("*.cs", "*.tt", "*.xaml", "*.csproj", "*.sln", "*.xml", "*.cmd", "*.txt")
get-childitem -path $path -recurse -exclude $excluded
于 2013-10-06T11:02:49.067 回答
11

以下是使用 Where-Object cmdlet 的方法:

$exclude = @(".cs", ".tt", ".xaml", ".csproj", ".sln", ".xml", ".cmd", ".txt")
Get-ChildItem -Path $path -Recurse | Where-Object { $exclude -notcontains $_.Extension }

如果您不希望在结果中也返回目录,请使用以下命令:

$exclude = @(".cs", ".tt", ".xaml", ".csproj", ".sln", ".xml", ".cmd", ".txt")
Get-ChildItem -Path $path -Recurse | Where-Object { (-not $_.PSIsContainer) -and ($exclude -notcontains $_.Extension) }
于 2013-10-06T15:14:42.653 回答
2
Set-Location C:\

$ExcludedcDirectory = "Windows|Program|Visual|Trend|NVidia|inet"
$SearchThis = Get-ChildItem -Directory | where Name -NotMatch $ExcludedcDirectory

$OutlookFiles = foreach ($myDir in $SearchThis) {    
    $Fn = Split-Path $myDir.fullname
    $mypath = "Get-ChildItem -Path $Fn\*.pst, *.ost -Recurse -ErrorAction SilentlyContinue" 

     Invoke-Expression "$mypath"
}
$OutlookFiles.FullName
于 2017-08-17T07:52:38.763 回答
0

您可以使用 Where-Object 执行此操作:

Get-ChildItem -Path $path -Recurse | Where-Object { $_.Extension -notin @("*.cs", "*.tt", "*.xaml", "*.csproj", "*.sln", "*.xml", "*.cmd", "*.txt")}
于 2020-02-25T14:05:35.943 回答