Войти

Показать полную графическую версию : Помогите допилить скрипт сортировки файлов - по Количеству указанному в ($split)


dark-------13
09-10-2012, 21:19
Здравствуйте,


Подскажите пожалуйста, как допилить этот скрипт, чтобы скрипт делал следующие действия:
По указанному значению в переменной $split переносил бы файлы в созданную папку с номером 1, потом переходил к следующим файлам и копировал их в другую созданную папку, но уже с номером 2 и тд. пока не закончатся все файлы


$Path = "e:\Test\in"
$dest = "e:\Test\out"
$counter = 1
$split = 2
$postfix=1
while ($counter -ne $split){
Get-ChildItem $Path -Recurse -include *.jpg, *.png, *.gif | ? {!$_.PSIsContainer} | copy-Item -Destination {

$folder = "$dest\$($_.$folder,$postfix)"
md $folder -Force | Out-Null

$fpath = Join-Path $folder $_.Name

$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
$counter++
$postfix++
}

Kazun
09-10-2012, 23:27
Можете более четко объяснить задачу,т.к. условия не понятны.

dark-------13
09-10-2012, 23:48
Есть папка с вложенными папками скажем с общим количеством 5000 фоток, нужно скопировать эти фотки в отдельные папки - например по 1000 штук в каждую папку, папки соответственно нумеруем 1,2,3,4,5

Был такой вариант на бат , но хотелось бы на powershell

@echo off
SETLOCAL EnableDelayedExpansion

set $SRC=D:\PICS
set $DST=D:\NEW

for /d %%a in ("%$SRC%\*") do (set/a $n=-1
for /f "delims=" %%b in ('dir/b/s/a-d "%%a\*.jpg"2^>nul') do (set/a $n+=1
set/a $m=1+!$n!/500
if not exist "%$DST%\%%~na\!$m!" md "%$DST%\%%~na\!$m!"
move/-y "%%b" "%$DST%\%%~na\!$m!\">nul
))

Foreigner
10-10-2012, 00:34
dark-------13, Если правильно понял

$split = 5
$folder = 1

$files = gci *.png, *.jpg

for ( $i = 0; $i -le $files.count; $i += $split ) {

ni -t dir $folder

$i..($split+$i-1) | % {

if ($files[$_]) { move-item $files[$_] $folder }

}

$folder++

}

Kazun
10-10-2012, 01:31
$Path = "e:\Test\in"
$dest = "e:\Test\out"

$prefix = 0
$counter = 1
$split = 2
$files = Get-ChildItem $Path -Recurse -include *.jpg, *.png, *.gif | ? {!$_.PSIsContainer}
$fcount = $files.count
$step = [math]::Floor($fcount/$split)
$j = $step -1

while($prefix -lt $fcount)
{
if($counter -gt $split)
{
$counter =1
}

$files[$prefix..$j] | copy-Item -Destination {
$folder = "$dest\$counter"
md $folder -Force | Out-Null

$fpath = Join-Path $folder $_.Name

$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
$prefix = $j + 1
$j += $step
$counter++
}

dark-------13
10-10-2012, 12:25
Уважаемый Kazun спасибо что помогаете, наверное мне еще более подробно нужно было описать работу скрипта.
Скрипт работает немножко не так, как хотелось бы.

Работать скрипт должен следующим образом:
1.Скрипт рекурсивно должен просматривать папку и вложенные папки на предмет указанных изображений
2.Количество картинок должно указываться в переменной $split и скрипт должен копировать картинки по 1000 штук в папку.
!!! Каждая новая папка должна создаваться автоматом (,а не по указанию количества в переменной), каждая папка должна отличаться от предыдущей на 1 !!!

3.Если при копировании имена файлов совпадают то добавляем к файлу постфикс - после имени , но перед точкой.
4.В последний каталог попадут не обязательно ровно 1000 штук....

Вам Foreigner тоже огромное спасибо за участие в исправлении скрипта, но ваш вариант скрипт пока не тестировал.

Kazun
10-10-2012, 12:50
Так $split или 1000?

dark-------13
10-10-2012, 13:23
Я должен ручками задать количество копируемых картинок в количестве 1000 , замечу что в исходной папке и подпапках общее количество у меня больше где-то около 5000 тысяч.
Если мы меняем количество картинок в папке то соответственно количество папок у нас увеличится.

При количестве 1000 папок будет 5
При количестве 500 папок будет 10

На $split не смотрите, наверное она здесь не нужна вообще , да точно эта переменная не нужна.

В батскрипте это количество указывается вот такой строкой, со значением 500
set/a $m=1+!$n!/500

Kazun
10-10-2012, 14:08
$Path = "e:\Test\in"
$dest = "e:\Test\out"


$prefix = 0
$counter = 1
$split = 1000
$files = Get-ChildItem $Path -Recurse -include *.jpg, *.png, *.gif | ? {!$_.PSIsContainer}
$fcount = $files.count
$step = $split - 1

while(Test-Path "$dest\$counter")
{
$counter++
}

while($prefix -lt $fcount)
{
$files[$prefix..$step] | copy-Item -Destination {
$folder = "$dest\$counter"
md $folder -Force | Out-Null

$fpath = Join-Path $folder $_.Name

$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
$prefix = $step + 1
$step += $split
$counter++
}

dark-------13
10-10-2012, 15:02
Спасибо вам Kazun - все отлично работает. Теперь отсортирую фотки на своем компе. Лично от себя какую вы книжку по powershell посоветуете почитать - для человека, который не силен в программировании.

Kazun
10-10-2012, 15:11
К обязательному прочтению всем(независимо от уровня):
1) Bruce Payette - Windows Powershell in Action, 2nd Edition
2) Lee Holmes - Windows PowerShell Cookbook, 2nd Edition

Но для начала Don Jones - Learn Windows PowerShell in a Month of Lunches ,потом уже можно перейти к книгам выше. На русском посоветовать ничего не могу,материал устарел.




© OSzone.net 2001-2012