2015-11-20 4 views
0

У меня есть папка, которая содержит много огромных файлов. Я хочу разбить эти файлы в 3 папки. Требование состоит в том, чтобы получить количество файлов в основной папке, а затем разделить их на 3 дочерние папки. Пример. В основной папке 100 файлов. Когда я запускаю powershell, 3 дочерние папки должны быть созданы с 33, 33 и 34 файлами соответственно. Как мы можем это сделать с помощью Powershell?Powershell to Split огромная папка в нескольких папках

Я попытался следующие:

$FileCount = (Get-ChildItem C:\MainFolder).count 
Get-ChildItem C:\MainFolder -r | Foreach -Begin {$i = $j = 0} -Process { 
    if ($i++ % $FileCount -eq 0) { 
    $dest = "C:\Child$j" 
    md $dest 
    $j++ 
    } 
    Move-Item $_ $dest 
} 
+0

Прежде всего, сначала попробуйте что-то свое и сообщите нам, если у вас есть проблема и как мы можем это исправить. 'Get-ChildItem' вернется и будет массивом. Подсчет элементов подскажет вам, сколько у вас предметов, и вы можете запросить проверку, разделив группу на 3 и оставив остальных в последней группе. – Matt

+0

Я пробую этот код. Он создает одну дочернюю папку, но не перемещает какой-либо файл. $ FileCount = (Get-ChildItem C: \ MainFolder).count Get-ChildItem C: \ MainFolder -r | Foreach -Begin {$ я = $ J = 0} {-Process если ($ я ++% $ FileCount -eq 0) {$ приемник = "C: \ Child $ J" мкр $ Dest $ j ++ } Переместить-Item $ _ $ dest } – user3220846

ответ

1

Это супер быстрый и грязный, но это делает работу.

#Get the collection of files 
$files = get-childitem "c:\MainFolder" 

#initialize a counter to 0 or 1 depending on if there is a 
#remainder after dividing the number of files by 3. 
if($files.count % 3 -eq 0){ 
    $counter = 0 
} else { 
    $counter = 1 
} 

#Iterate through the files 
Foreach($file in $files){ 

    #Determine which subdirectory to put the file in 
    If($counter -lt $files.count/3){ 
      $d = "Dir1" 
    } elseif($counter -ge $files.count/3 * 2){ 
      $d = "Dir3" 
    } else { 
     $d = "Dir2" 
    } 

    #Create the subdirectory if it doesn't exist 
    #You could just create the three subdirectories 
    #before the loop starts and skip this 
    if(-Not (test-path c:\Child\$d)){ 
     md c:\Child\$d 
    } 

    #Move the file and increment the counter 
    move-item $file.FullName -Destination c:\Child\$d 
    $counter ++ 
} 
1

Я думаю, что можно обойтись без учета и распределения. Это решение:

  • список всех файлов
  • Добавляет встречное свойство, которое на основе циклов 0,1,2,0,1,2,0,1,2 для каждого файла
  • группирует их в ведра на счетчике
  • движется каждое ведро в одной команде

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

$files = (gci -recurse).FullName 
$buckets = $files |% {$_ | Add-Member NoteProperty "B" ($i++ % 3) -PassThru} |group B 

$buckets.Name |% { 
    md "c:\temp$_" 
    Move-Item $buckets[$_].Group "c:\temp$_" 
} 
0

Это еще одно решение. Это означает, что вспомогательные папки не существуют.

# Number of groups to support 
$groupCount = 3 
$path = "D:\temp\testing" 
$files = Get-ChildItem $path -File 

For($fileIndex = 0; $fileIndex -lt $files.Count; $fileIndex++){ 
    $targetIndex = $fileIndex % $groupCount 
    $targetPath = Join-Path $path $targetIndex 
    If(!(Test-Path $targetPath -PathType Container)){[void](new-item -Path $path -name $targetIndex -Type Directory)} 
    $files[$fileIndex] | Move-Item -Destination $targetPath -Force 
} 

Если вам нужно разделить файлы в различные количества групп использования $groupCount высших этот 3. Можно также работать с логикой switch, что бы изменить $groupCount на что-то другое, если количество было больше, что 500 например.

Петля, хотя файлы по одному. Используя $fileIndex в качестве трекера, мы определяем папку 0,1 или 2 в моем случае, что файл будет помещен в. Затем, используя это значение, мы проверяем, существует ли целевая папка. Да, эта логика может быть легко размещена вне цикла, но если у вас есть изменения файлов и папок во время работы скрипта, вы можете утверждать, что он более устойчив.

Убедитесь, что папка существует, если она не установлена. Затем переместите этот элемент. Используя оператор модуля, как и в других ответах, нам не нужно беспокоиться о том, сколько файлов есть. Пусть PowerShell выполнит математику.