Показать полную графическую версию : Помогите допилить скрипт сортировки файлов - по Количеству указанному в ($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++
}
Можете более четко объяснить задачу,т.к. условия не понятны.
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++
}
$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 тоже огромное спасибо за участие в исправлении скрипта, но ваш вариант скрипт пока не тестировал.
dark-------13
10-10-2012, 13:23
Я должен ручками задать количество копируемых картинок в количестве 1000 , замечу что в исходной папке и подпапках общее количество у меня больше где-то около 5000 тысяч.
Если мы меняем количество картинок в папке то соответственно количество папок у нас увеличится.
При количестве 1000 папок будет 5
При количестве 500 папок будет 10
На $split не смотрите, наверное она здесь не нужна вообще , да точно эта переменная не нужна.
В батскрипте это количество указывается вот такой строкой, со значением 500
set/a $m=1+!$n!/500
$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 посоветуете почитать - для человека, который не силен в программировании.
К обязательному прочтению всем(независимо от уровня):
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.