Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232

Не работают фильтры Where-Object в конвейере при передаче объектов для архиватора

28.09.2018, 06:44. Показов 2957. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Возникла проблема и все ума не приложу в чем загвоздка.
Требуется отфильтровать файлы в папке и передать их архиватору 7-zip.


Что я делаю:

PowerShell
1
Get-ChildItem $dirPath | Where-Object {$_.BaseName -match "CumuIncrDBList"} | sevenzip a -bt -sdel -mx9 -y BackupZip.7z $_
sevenzip - алиас для архиватора.
Прикол в том, что архиватору передаются вообще все файлы будто Where-Object вообще не было, но если выполнить команду без архиватора (Get-ChildItem $dirPath | Where-Object {$_.BaseName -match "CumuIncrDBList"}), то выдается корректный отфильтрованный список.

Понять не могу почему так происходит. Тот же эффект будет, если убрать Where-Object и добавить параметр -Exclude для Get-ChildItem. Сам по себе фильтр работает, но когда передаю объекты в архиватор, то ему подается на вход все файлы без фильтра.

Что здесь не так?

Добавлено через 1 час 31 минуту
Нашел обходное решение, но все равно интересно почему не работает конвейер.

Обходное решение вот:
PowerShell
1
2
3
4
5
6
7
8
9
10
$nameTmpFile = "FilesForBackup" + "-" + @(Get-Date -uformat %Y-%m-%d)[0] + "-" + @(Get-Random)[0] + ".txt"
$nameBackup = $fileNameMask + "-" + @(Get-Date -uformat %Y-%m-%d)[0] + @(Get-Random)[0] + ".7z"
    
$tmpFile = (New-Item -Path $env:TEMP -Name $nameTmpFile -ItemType "file").FullName
    
Get-ChildItem $dirPath | Where-Object -FilterScript {$_.BaseName -match "CumuIncrDBList"} | ForEach-Object {Out-File -FilePath $tmpFile -InputObject $_.FullName -Append -Encoding ASCII}
    
sevenzip a -bt -sdel -mx9 -y $nameBackup @$tmpFile
    
Remove-Item -LiteralPath $tmpFile -Force
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2018, 06:44
Ответы с готовыми решениями:

При передаче функции готового списка - получаю ошибку TypeError: 'list' object is not callable
Вот как выглядит сама функция def Grad(self, a_SummErrors): The_dXdW = self.dXdW() return * The_dXdW for t in...

Реализация сервер - клиенты через Сокеты. Размер буфера при передаче списков объектов
Доброго времени суток. Пишу приложение по ведению заказов. Столкнулся с проблемой. Есть сервер и множество клиентов. На сервере...

подчиненная форма - не работают фильтры
создал подчиненную табличную форму1 на основе запроса1: - в таблице формы, данные выводятся без фильтрации(запрос1) - и нет списков для...

4
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
28.09.2018, 10:35
Dimasio,
Нашел обходное решение, но все равно интересно почему не работает конвейер.
Это не обходное решение, а правильное

Добавлено через 2 минуты
Не знаю что за sevenzip, но очевидно, что он неправильно принимает входные данные конвеера.

Добавлено через 4 минуты
По воду архивации кстати можно уйти в сторону system.io.compression, такой подход будет более универсальным
2
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
28.09.2018, 10:58
Цитата Сообщение от Dimasio Посмотреть сообщение
Что здесь не так?
Что там не так, уже подсказали.
Вот, есть такой готовый скрипт с комментами, не помню по чьей просьбе созданный:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# Архивация файлов с использованием встроенного упаковщика или внешнего
function arch-filter ($swt1,$swt2) {
    process{
        # Запоминаем имя каталога
        $dname = $_.basename
        # Проверяем наличие каталога для архивов, если нет, создаем
        if(!(test-path (
            $a = $_.fullname + $f_bck
        ) -patht container)){md $a|out-null}
        # Формируем массив файлов для архивации, созданных раньше месяца назад
        $arr = dir $_.fullname -filt $flt2 -file|%{
            if($_.lastwritetime.month -le (get-date).addmonths(-1).month){
                $_.fullname
            }
        }
        if($arr){
            # Формируем имя архива с текущей датой
            $b = $a+'\'+$dname+('_{0:yyyy-MM-dd_HH-mm-ss}' -f (get-date))+'.zip'
            # Собственно, архивация
            if (!$swt1){
                compress-archive $arr $b -force
                if ($swt2){del (gi $arr).fullname -force}
            } else {
                if ($swt2){&$arch a $b $arr -sdel} else {&$arch a $b $arr}
            }
        } else {
            write-host "В каталоге $dname файлы для архивирования отсутствуют." -foreg yellow
        }
    }
}
#корневой каталог, лучше указать абсолютный путь:
$fld = 'logs'
#подкаталог для хранения архивов (обязательный формат со слешем):
$f_bck = '\bkp'
#фильтр для отбора каталогов содержащих файлы *.txt:
$flt1 = 'folder*'
#фильтр для отбора только файлов *.txt:
$flt2 = '*.txt'
#путь к файлу внешнего архиватора 7zip
$arch = 'c:\Program Files\7-Zip\7z.exe'
 
#ключ для выбора вида компрессии: 0 - встроенная упаковка, 1 - внешний архиватор 7zip
$swtch1 = 1
#ключ для выбора удаления исходных файлов: 0 - не удалять, 1 - удалять
$swtch2 = 1 
 
# Массив подкаталогов для архивации, с передачей в функцию архивирования
dir $fld -filt $flt1 -dir|arch-filter $swtch1 $swtch2
Вполне можно адаптировать этот скрипт под Ваши нужды.
2
505 / 158 / 49
Регистрация: 27.02.2016
Сообщений: 818
28.09.2018, 16:55
Лучший ответ Сообщение было отмечено Dimasio как решение

Решение

PowerShell
1
2
$d = '.'
& "c:\Program Files\7-Zip\7z.exe" a -bt  -sdel -mx9 -y a.zip (get-childitem -path $d | where-object -FilterScript {$_.baseName -match "form*"} )

PowerShell
1
2
3
Updating archive: a.zip
 
Items to compress: 3
но если ничего не было в backtick то 7-zip получит пустой лист и по умолчанию запакует всю директорию

повторям команду
(все form* только что запаковано

PowerShell
1
2
3
Updating archive: a.zip
 
Items to compress: 9
- все остальное ушло в архив
2
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
29.09.2018, 07:18  [ТС]
Цитата Сообщение от v_svitere Посмотреть сообщение
Не знаю что за sevenzip, но очевидно, что он неправильно принимает входные данные конвеера.
Значит это не особенность powershell, а корявость 7zip, это хорошо, а то я голову сломал почему так происходит.

Цитата Сообщение от YuS_2 Посмотреть сообщение
Вот, есть такой готовый скрипт с комментами, не помню по чьей просьбе созданный
Спасибо за скрипт, интересный, 3 момента для себя новых подцепил: интересный способ формирования даты для имени с помощью '_{0:yyyy-MM-dd_HH-mm-ss}' -f (get-date), в первый раз такое вижу, ну и ни разу не встречал фильтрацию по конвейеру с помощью %{}, обычно Where-Object использовал. Ну и еще узнал, что есть командлет compress-archive, тогда лучше им буду пользоваться)

Цитата Сообщение от skouzmine Посмотреть сообщение
но если ничего не было в backtick то 7-zip получит пустой лист и по умолчанию запакует всю директорию
Спасибо за идею передачи параметра в качестве вычисляемого выражения, почему-то сам до этого не догадался) Хотя мне важно чтобы не создавался архив папки при пустом параметре, поэтому мой вариант предпочтительнее, там можно запустить архивацию только если список файлов не пустой, сделать проверку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2018, 07:18
Помогаю со студенческими работами здесь

Не работают фильтры по полям со списком!
Всем добрый день! Такая проблема: была БД в 2003 access: таблица 1-шт, формы 2-шт: ленточная и столбец, 5 шт полей со списками для...

После добавления данных в таблицу не работают фильтры
Если сначала применять фильтры над уже существующими данными, все в порядке. Добавляют новую запись, и фильтры не применяются.

Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию?
Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию? Зависит ли это от...

Bat файл для архиватора
Добрый день друзья! Хочу написать бат файл для архиватора: поиск файлов с определенным расширением(.doc, .xlsx, .jpg, . . .) и архивация...

Написать процедуру для суммирования матриц. Ошибка при передаче массива в функцию
Помогите пожалуйста! Дано задание: Написать процедуру для суммирования матриц. С ее помощью сложить исходную матрицу и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru