Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Добавить прогресс бар в готовый скрипт (http://forum.oszone.net/showthread.php?t=335303)

c4uran 12-06-2018 21:10 2818001

Добавить прогресс бар в готовый скрипт
 
День добрый, есть такой не сложный скрипт который ищет дубликаты файлов в папке
он работает со свичем 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 2818009

внутрь 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 2818035

Busla, Пытался так сделать он считает обращение файла к каждому получается тысячи тысяч в прогрессе

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

Busla 13-06-2018 10:06 2818069

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

Цитата:

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

переписать надо почти всё, я уже написал почему

c4uran 13-06-2018 23:13 2818154

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

Iska 14-06-2018 01:03 2818157

c4uran, он же подсказал:
Цитата:

Цитата Busla
переписать надо почти всё »


c4uran 14-06-2018 08:34 2818168

Iska, ну я понял, поэтому прошу что бы подсказали какая должна быть логика скрипта, если эта не подходит...

YuS_2 14-06-2018 09:32 2818178

Цитата:

Цитата c4uran
у меня просто нет даже идей »

Для начала, надо определиться с алгоритмами...
Вот это вот:
Цитата:

Цитата c4uran
он работает со свичем names, если установить его то он ищет дубликаты по названию файлов »

Что подразумевается под дубликатом? Стандартно, это полное совпадение, но у Вас:
Цитата:

Цитата c4uran
ищет просто по размеру, если у двух файлов совпадает размер или часть имени совпадает »

Совпадение части имени - это дубликат? А совпадение какой части из имени будет определяющим?
В общем, условия уточнить требуется, чтобы получить помощь с решением...
Ну и примеры файлов, было бы неплохо привести... дубликаты, уникальные и т.п.

Busla 14-06-2018 11:02 2818194

YuS_2, как бы по коду понятно, что и как оно сравнивает

Цитата:

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

у меня прогресс нормально показывается

Цитата:

Цитата c4uran
какая должна быть логика скрипта, если эта не подходит... »

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

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

YuS_2 14-06-2018 12:02 2818212

Цитата:

Цитата Busla
как бы по коду понятно, что и как оно сравнивает »

Не всегда то, что видится, есть на самом деле :)
Тем более, скрипт поправлялся от момента публикации...

Iska 25-10-2018 18:15 2837584

scum01001, это Вы к чему всё написали?

Iska 26-10-2018 20:16 2837823

Цитата:

Цитата scum01001
Осталось привязать к процессу »

scum01001, знаете анекдот про мышек и мудрого филина? Здесь он будет в аккурат к месту.


Время: 07:32.

Время: 07:32.
© OSzone.net 2001-