我有一个包含许多大文件的文件夹。我想将这些文件拆分为3个文件夹。要求是获取主文件夹中的文件计数,然后将这些文件平均分成3个子文件夹。 示例 - 主文件夹有100个文件。当我运行powershell时,应分别使用33,33和34个文件创建3个子文件夹。 我们怎样才能使用Powershell做到这一点?
我尝试过以下方法:
repeat = (N<2) ? N : 2;
for ( i = 0; repeat > 0; repeat--, i = N-1 )
答案 0 :(得分:2)
这是另一种解决方案。这个帐户不存在子文件夹。
# 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
。也可以使用switch
处理逻辑,将$groupCount
更改为某些内容否则,如果计数大于500,例如。
逐个循环文件。使用$fileIndex
作为跟踪器,我们确定文件将放入的文件夹0,1或2。然后使用该值检查以确保目标文件夹存在。是的,这个逻辑可以很容易地放在循环之外,但如果你在脚本运行时更改了文件和文件夹,你可能会认为它更有弹性。
确保文件夹存在,如果不存在则。然后移动那一项。使用模数运算符,就像在其他答案中一样,我们不必担心有多少文件。让PowerShell做数学运算。
答案 1 :(得分: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 ++
}
答案 2 :(得分:1)
我认为没有做计数和自己分配是可能的。这个解决方案:
可以通过多种方式重写它以使其更好,但这可以节省数学,处理不均匀的分配,迭代文件并一次移动一个文件,可以轻松调整到不同的团体数量。
$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$_"
}