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"
он работает со свичем 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"