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

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

dark-------13 09-10-2012 21:19 2002311

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


Подскажите пожалуйста, как допилить этот скрипт, чтобы скрипт делал следующие действия:
По указанному значению в переменной $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 2002390

Можете более четко объяснить задачу,т.к. условия не понятны.

dark-------13 09-10-2012 23:48 2002401

Есть папка с вложенными папками скажем с общим количеством 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 2002415

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 2002436

Код:

$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 2002639

Уважаемый Kazun спасибо что помогаете, наверное мне еще более подробно нужно было описать работу скрипта.
Скрипт работает немножко не так, как хотелось бы.

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

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

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

Kazun 10-10-2012 12:50 2002651

Так $split или 1000?

dark-------13 10-10-2012 13:23 2002672

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

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

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

В батскрипте это количество указывается вот такой строкой, со значением 500
Код:

set/a $m=1+!$n!/500

Kazun 10-10-2012 14:08 2002700

Код:

$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 2002738

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

Kazun 10-10-2012 15:11 2002751

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


Время: 07:24.

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