PDA

Показать полную графическую версию : Добавить прогресс бар в готовый скрипт


c4uran
12-06-2018, 21:10
День добрый, есть такой не сложный скрипт который ищет дубликаты файлов в папке
он работает со свичем names, если установить его то он ищет дубликаты по названию файлов (названия файлов многосоставное с разделителем - точка)
если без свича то ищет просто по размеру, если у двух файлов совпадает размер или часть имени совпадает то перемещает их в директорию trash\names или trash\size

так вот дело в том что скрипт довольно долго работает и я хочу прикрутить к нему не сложный прогресс бар, вроде такого, но у меня это никак не выходит :(

$totalTimes = 10

$i = 0

for ($i=0;$i -lt $totalTimes; $i++) {

$percentComplete = ($i / $totalTimes) * 100

Write-Progress -Activity 'Doing thing' -Status "Did thing $i times" -PercentComplete $percentComplete

sleep 1

}

помогите пожалуйста сделать так чтобы прогресс бар заполнялся по мере обработки каждого файла

А вот сам скрипт поиска дубликатов



$RootFolder = "\\server\test"
$WorkFolder = $RootFolder + "\sort"
$TrashFolder = $RootFolder + "\trash"
$LogFile = $RootFolder + "\dups.log"

if (-not(Test-Path $WorkFolder)) { Write-Host "ОШИБКА $WorkFolder не существует" -ForegroundColor red; Return }
if (-not(Test-Path $TrashFolder)) { Write-Host "Создаю $TrashFolder" -ForegroundColor yellow; New-Item -ItemType "directory" -Path $TrashFolder }

Function WriteLog($str, $Color) {
$logstr = ((Get-Date -UFormat "%Y.%m.%d %T") + " " + $str)
$logstr >> $LogFile
Write-Host $logstr -ForegroundColor $Color
}

function DuplicateCandidate([string]$DupsParam) {

$Files = Get-ChildItem -Path $WorkFolder | Where {!$_.PsIsContainter -and $_.BaseName -match "\."}

$arr = foreach($i in $Files) {

$files | Where {$_.Name -ne $i.Name} | Where {

if ($DupsParam -eq "names") {

(Compare-Object $_.BaseName.Split(".") $i.BaseName.Split(".") -IncludeEqual -ExcludeDifferent).Count -ge 4

} else {

$files | Where {$_.Name -ne $File.Name} | Where { $_.Length -eq $File.Length}

}
}
}

if ($DupsParam -eq "names") {

Return ($arr | Select -Uniq)

} else {

if (Test-Path $arr.FullName) {

if (-not(Test-Path ($TrashFolder + "\" + $arr.Name))) {

$arr | % { WriteLog "Переместил $_ в Корзину" "green" }

Move-Item -Path $arr.FullName -Destination $TrashFolder -WhatIf

}
}
}
}

function GetDuplicates([string]$DupsParam) {

WriteLog "---------------------------------------------------------------------------------" "yellow"
WriteLog "Ищем дубликаты" "yellow"

$FindDups = DuplicateCandidate $DupsParam

if (($FindDups).count -eq 0 ) {
WriteLog "--------------------------" "green"
WriteLog "Дубликаты не найдены" "green"
} else {
WriteLog "--------------------------" "yellow"
($FindDups).Name | sort -Descending | % {WriteLog "$_" "yellow" }
}
}

GetDuplicates "Names"

Busla
12-06-2018, 22:04
внутрь foreach добавить итератор и вызвать Write-Progress, примерно так:

$k = 0
$totalTimes = $Files.Length

$arr = foreach($i in $Files) {

$percentComplete = ($k / $totalTimes) * 100
Write-Progress -Activity 'Doing thing' -Status "Did thing $k times" -PercentComplete $percentComplete
$k++

$files | Where {$_.Name -ne $i.Name} | Where {

Но это очень неэффективная реализация: нет смысла внутри цикла пробегать по всем файлам, нужно только по оставшимся.

c4uran
13-06-2018, 00:02
Busla, Пытался так сделать он считает обращение файла к каждому получается тысячи тысяч в прогрессе

Возможно необходимо эту часть кода как-то переписать?

Busla
13-06-2018, 10:06
c4uran, я неверно "скрестил" два ваших примеру - у вас уже используется переменная $i, исправил
в остальном - вы что-то перепутали в своих экспериментах, тысячам тысяч взяться просто неоткуда

Возможно необходимо эту часть кода как-то переписать? »
переписать надо почти всё, я уже написал почему

c4uran
13-06-2018, 23:13
Busla, Дело не в похожих переменных, разумеется я их переименовал, подскажите пожалуйста как необходимо переписать эту часть кода, как еще сравнивать имена файлов у меня просто нет даже идей

Iska
14-06-2018, 01:03
c4uran, он же подсказал:
переписать надо почти всё »

c4uran
14-06-2018, 08:34
Iska, ну я понял, поэтому прошу что бы подсказали какая должна быть логика скрипта, если эта не подходит...

YuS_2
14-06-2018, 09:32
у меня просто нет даже идей »
Для начала, надо определиться с алгоритмами...
Вот это вот:
он работает со свичем names, если установить его то он ищет дубликаты по названию файлов »
Что подразумевается под дубликатом? Стандартно, это полное совпадение, но у Вас:
ищет просто по размеру, если у двух файлов совпадает размер или часть имени совпадает »
Совпадение части имени - это дубликат? А совпадение какой части из имени будет определяющим?
В общем, условия уточнить требуется, чтобы получить помощь с решением...
Ну и примеры файлов, было бы неплохо привести... дубликаты, уникальные и т.п.

Busla
14-06-2018, 11:02
YuS_2, как бы по коду понятно, что и как оно сравнивает

Дело не в похожих переменных, разумеется я их переименовал »
у меня прогресс нормально показывается

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

Ну а поскольку вам на выходе нужен просто список дубликатов - уже найденные дубликаты можно вообще исключить из дальнейшего сравнения. Но тут уже не всё тривиально.

YuS_2
14-06-2018, 12:02
как бы по коду понятно, что и как оно сравнивает »
Не всегда то, что видится, есть на самом деле :)
Тем более, скрипт поправлялся от момента публикации...

Iska
25-10-2018, 18:15
scum01001, это Вы к чему всё написали?

Iska
26-10-2018, 20:16
Осталось привязать к процессу »
scum01001, знаете анекдот про мышек и мудрого филина? Здесь он будет в аккурат к месту.




© OSzone.net 2001-2012