-Exclude和-Filter可以一起使用吗?

时间:2019-05-26 23:53:48

标签: powershell

我要使用以下脚本,因此我试图获取名称为Member而不是Member AND server[-1]的任何最新csv文件

假定服务器是其中包含服务器的阵列。例如,应忽略的文件为Members_server1.domain.com.csv

Get-ChildItem "$csvLocation" -Filter '*Members*.csv' -Exclude "*Members_$($Server[-1])*.csv" | Where-Object {
                    $_.LastWriteTime.GetDateTimeFormats()[44] -eq $today
                } | Move-Item -Destination "$csvLocation\$($DBName)_Members_$($Server[-1]).csv" -Force

但是,排除似乎没有工作。

我在做什么错了?

2 个答案:

答案 0 :(得分:3)

是的,-Filter-Exclude可以一起使用-Filter在源处使用过滤器(要求文件系统执行过滤,这要快得多与使用-Include))和-Exclude相比,PowerShell将排除匹配项。

但是,使用Get-ChildItem时,-Include-Exclude参数令人惊讶地仅直接应用于(隐含的)-Path或{ {1}}参数,而不是其子代

在包含-LiteralPath的同时,将包含/排除项扩展到目标文件夹 内所有项目的叶组件,这显然改变了行为,因为不仅是 immediate < / em>处理了孩子。

要在应用包含/排除项时仅处理直系子代,请使用通配符表达式-Recurse

*

请注意,Get-ChildItem $csvLocation/* -Filter *Members*.csv -Exclude "*Members_$($Server[-1])*.csv" 在这种情况下同样有效,因为 child -item处理的方面是通过通配符表达实现的。

答案 1 :(得分:1)

否,过滤器似乎不需要包含和排除而不是过滤器。 使用Where-Object(?),您可以将Name或FullName指定为过滤器的一部分:

Get-ChildItem "$csvLocation" | Where-Object { $_.Name -like '*Members*.csv' -and $_.Name -notlike "*Members_$($Server[-1])*.csv" -and $_.LastWriteTime.GetDateTimeFormats()[44] -eq $today } | Move-Item -Destination "$csvLocation\$($DBName)_Members_$($Server[-1]).csv" -Force

或指定您自己的函数

# setup example 
$today = [datetime]::Today.GetDateTimeFormats()[44]
$Server = @('server1')
$DBName = 'dbname'

echo test > 'members.csv'
echo test > 'members_server1.csv'

# functions
function FilterCsvFiles() {

    param(
        [System.IO.FileSystemInfo[]] $fileInfos
    )

    return $fileInfos | Where-Object { $_.Name -like '*Members*.csv' -and $_.Name -notlike "*Members_$($Server[-1])*.csv" -and $_.LastWriteTime.GetDateTimeFormats()[44] -eq $today } 
}
# move items
Get-ChildItem "$csvLocation" | FilterCsvFiles | Move-Item -Destination "$csvLocation\$($DBName)_Members_$($Server[-1]).csv" -Force