Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Добавить прогресс бар в готовый скрипт

Ответить
Настройки темы
PowerShell - Добавить прогресс бар в готовый скрипт

Пользователь


Сообщения: 122
Благодарности: 6

Профиль | Отправить PM | Цитировать


Изменения
Автор: c4uran
Дата: 12-06-2018
Описание: поправил скрипт
День добрый, есть такой не сложный скрипт который ищет дубликаты файлов в папке
он работает со свичем 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"

Отправлено: 21:10, 12-06-2018

 

Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


внутрь 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 {
Но это очень неэффективная реализация: нет смысла внутри цикла пробегать по всем файлам, нужно только по оставшимся.

Последний раз редактировалось Busla, 13-06-2018 в 10:09. Причина: было одинаковое имя переменной у разных сущностей


Отправлено: 22:04, 12-06-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 122
Благодарности: 6

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 00:02, 13-06-2018 | #3


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 10:06, 13-06-2018 | #4


Пользователь


Сообщения: 122
Благодарности: 6

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:13, 13-06-2018 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


c4uran, он же подсказал:
Цитата Busla:
переписать надо почти всё »

Отправлено: 01:03, 14-06-2018 | #6


Пользователь


Сообщения: 122
Благодарности: 6

Профиль | Отправить PM | Цитировать


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

Отправлено: 08:34, 14-06-2018 | #7


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1167
Благодарности: 486

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Отправлено: 09:32, 14-06-2018 | #8


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


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

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

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

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

Отправлено: 11:02, 14-06-2018 | #9


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1167
Благодарности: 486

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Отправлено: 12:02, 14-06-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Добавить прогресс бар в готовый скрипт

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Помогите прикрутить прогресс бар к скрипту Виктор_Падий@vk Скриптовые языки администрирования Windows 4 13-11-2016 14:44
Добавить прогресс бар к скрипту support23 AutoIt 1 25-11-2012 06:53
[решено] Прогресс-бар для скрипта Tosyk AutoIt 10 23-09-2012 11:04
VBS/WSH/JS - [решено] Прогресс бар для vbscript neo21 Скриптовые языки администрирования Windows 2 27-10-2011 13:31
[решено] Прогресс бар semiono AutoIt 17 24-03-2009 23:18




 
Переход