我要使用以下脚本,因此我试图获取名称为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
但是,排除似乎没有工作。
我在做什么错了?
答案 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