Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
 Аватар для vavun
10593 / 5556 / 864
Регистрация: 07.04.2013
Сообщений: 15,660

Оптимизировать сформирование массива строк по заданным условиям

12.03.2019, 16:34. Показов 2814. Ответов 7
Метки нет (Все метки)

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

Продолжаю изучение posh.

Цель:
Перебрать содержимое всех вложенных директорий в D:\Temp не рекурсивно
Если в директории (рекурсивно) есть И жесткие ссылки И одиночные файлы - сохранить в массив только полные пути к уникальным файлам
Если в директории (рекурсивно) ТОЛЬКО уникальные файлы - сохранить в массив только полный путь к данной директории.

Получилось вот:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$WorkDir = 'D:\Temp'
 
 
foreach ($Directory in (Get-ChildItem -Path $WorkDir -Directory).FullName)
{
 
    $AllFiles   = Get-ChildItem -File $Directory -Recurse
    $UniqFiles  = $AllFiles | Where-Object {-not $_.Target}
 
    if ( $AllFiles.Count -eq $UniqFiles.Count )
    {
        $WorkList = $WorkList + @($Directory)
    }
 
    elseIf ( $UniqFiles.Count -ne 0 )
    {
        $WorkList = $WorkList + @($UniqFiles.FullName)
    }
 
}
 
 
$WorkList | Set-Content -Path 'testlist.txt'
Можно ли это сделать красивше/быстрее (правильнее) ?

Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.03.2019, 16:34
Ответы с готовыми решениями:

Программа вывода строк по заданным условиям
Программа вводит две строки. Если длина второй строки больше 70 символов, то программа выводит на экран символы первой строки с нечетными...

Написать генерацию строк длины 10 по заданным условиям
Помогите написать максимально просто Написать генерацию строк длины 10, причем первые 4 символа - цифры, следующие два символа -...

Найти номера строк матрицы по заданным условиям
2)Дана целочисленная квадратная матрица порядка N. Найти номера строк: а)Все элементы которых - нули; б)все элементы которых четны.

7
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.03.2019, 17:12
Цитата Сообщение от vavun Посмотреть сообщение
Можно ли это сделать красивше/быстрее (правильнее) ?
Про "красивше/быстрее" не скажу, но вот короче и меньше переменных:

PowerShell
1
2
3
4
5
6
$WorkDir = 'D:\Temp'
 
Get-ChildItem -Path $WorkDir -Directory |%{
    if ($UniqFiles = Get-ChildItem -Path $_.FullName -File -Recurse | Where {-not $_.Target} | Select -Expand FullName) {$UniqFiles}
    else {$_.FullName}
} | Set-Content -Path 'testlist.txt'
1
 Аватар для vavun
10593 / 5556 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
12.03.2019, 17:21  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Про "красивше/быстрее" не скажу, но вот короче и меньше переменных:
В таком случае позволю себе сделать вывод о том, что я на верном пути.
А вообще мне так нагляднее, по крайней мере пока.

Если не затруднит объясните, что это такое, как это работает и для чего нужно ?
Цитата Сообщение от KDE777 Посмотреть сообщение
|%{
Периодически встречаю, но не пойму.

Спасибо.
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
12.03.2019, 17:23
Лучший ответ Сообщение было отмечено vavun как решение

Решение

vavun,
С практической точки зрения можно еще прибегнуть к командлету дифференцирования Compare-Object(diff)

Примерно так это выглядит.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$WorkDir = 'D:\Temp'
 
foreach ($Directory in (gci $WorkDir -Directory))
{
    $UniqFiles=($AllFiles= gci -File $Directory.fullname -Recurse)|?{!$_.target}    
    if(!(diff $UniqFiles $AllFiles))
    {
        $WorkList = $WorkList + @($Directory.fullname)
    }
    if(diff $AllFiles $UniqFiles|?{$_.sideIndicator -eq "<="})
    {
        $WorkList = $WorkList + @($UniqFiles.FullName)
    }
}
1
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.03.2019, 17:30
Цитата Сообщение от vavun Посмотреть сообщение
Периодически встречаю, но не пойму.
PowerShell
1
Get-Alias %
Добавлено через 1 минуту
+ перечитал ваши условия мой вариант из #2 не корректен...
1
 Аватар для vavun
10593 / 5556 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
12.03.2019, 17:33  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Get-Alias %
А ё-моё . Спасибо.
Цитата Сообщение от v_svitere Посмотреть сообщение
С практической точки зрения можно еще прибегнуть к командлету дифференцирования
С практической, это в каком плане ?
В плане не считать, а потом сравнивать сосчитанное, а вместо этого сразу сравнивать ?

Добавлено через 1 минуту
Цитата Сообщение от KDE777 Посмотреть сообщение
мой вариант из #2 не корректен
Не страшно, но буду иметь ввиду.
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
12.03.2019, 17:36
vavun,
С практической, это в каком плане ?
В плане не считать, а потом сравнивать сосчитанное, а вместо этого сразу сравнивать ?
В целом, да. Если есть уже реализованный инструмент, который может скажем сравнить два массива, и вывести например, только те данные которые есть только во втором, то почему бы им не воспользоваться?)
Также можно выводить, только совпадающие элементы или которые есть только в первом.
1
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.03.2019, 17:53
Лучший ответ Сообщение было отмечено vavun как решение

Решение

Исправленный вариант:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
$WorkDir = 'C:\Temp'
 
Get-ChildItem -Path $WorkDir -Directory | ForEach {
    
    if ($Group = Get-ChildItem -path $_.FullName -File -Recurse | select FullName,LinkType | Group LinkType)
    {
        if (($Group).Name -contains 'HardLink'){(($Group | ? Name -ne HardLink).Group).FullName}
        else {$_.FullName}
    }
 
} | Set-Content -Path 'testlist.txt'
Добавлено через 3 минуты
Цитата Сообщение от vavun Посмотреть сообщение
А ё-моё . Спасибо.
Только имейте в виду:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS C:\Temp> ps | foreach {$_} | ? id -lt 1
 
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
      0       0        0          4                 0   0 Idle
 
 
 
PS C:\Temp> foreach ($p in ps) {$p} | ? id -lt 1
строка:1 знак:25
+ foreach ($p in ps) {$p} | ? id -lt 1
+                         ~
Пустой элемент канала не допускается.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : EmptyPipeElement
Добавлено через 2 минуты
Getting to Know ForEach and ForEach-Object
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2019, 17:53
Помогаю со студенческими работами здесь

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

Обработка массива по заданным условиям
1)Дан А(5,5), найти четные числа массива. 2)Дан А(6),вывести элементы массива по возрастанию. 3)Дан А(6,6),найти отрицательные(или...

Исчисление суммы, количества элементов массива, удовлетворяющих заданным условиям
В массиве хранится информация о годе рождения каждого из 30 человек. Определить порядковый номер самого старшего по возрасту человека.

Исчисление суммы, количества элементов массива, удовлетворяющих заданным условиям
В одномерном массиве содержатся только два одинаковых элемента. Найдите их. можно как то сделать что бы элементов было не 5 как в...

Проверить, верно ли, что элементы массива удовлетворяют заданным условиям
Помогите пожалуйста перевести код программы из паскаля в с++.Если что,вот условия задачи:дан массив вещественных чисел. Выяснить: а)...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
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
/ * Дана цепь постоянного тока с 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/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru