Можно ли использовать -Exclude и -Filter вместе? - PullRequest
1 голос
/ 27 мая 2019

У меня есть следующий сценарий, в котором я пытаюсь получить любой последний csv-файл с Элементами в его имени, но не членами И server[-1] в его имени

предположим, что сервер - это массив, содержащий серверы.Например, файл, который следует исключить, будет 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 ]

3 голосов
/ 27 мая 2019

Да, -Filter и -Exclude могут использоваться вместе : -Filter фильтры на источнике (просит файловую систему выполнить фильтрацию, что намного быстрее, чем при использовании -Include))и -Exclude затем заставляет PowerShell исключать совпадения.

Однако с Get-ChildItem параметры -Include и -Exclude - как это ни удивительно - применяются только непосредственно к конечному компоненту (подразумеваемому)Аргумент -Path или -LiteralPath, а не его дочерние элементы .

При включении -Recurse расширяет включения / исключения для конечных компонентов всех элементов внутри целевая папка, которая явно меняет поведение, учитывая, что обрабатываются не только немедленные дочерние элементы.

Для обработки только непосредственных дочерних элементов при применении включений / исключений используйте шаблонное выражение *:

Get-ChildItem $csvLocation/* -Filter *Members*.csv -Exclude "*Members_$($Server[-1])*.csv"

Обратите внимание, что Get-Item будет одинаково работать в этом случае, учитывая, что аспект child -itemобработка достигается подстановочным знаком expression.

1 голос
/ 27 мая 2019

Нет, фильтры не требуют включения и исключения вместо фильтра. Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...