标题: [文件操作] [已解决]批处理如何将文件按照特定规则放入不同的文件夹分组? [打印本页]
作者: bataiping 时间: 2020-12-1 17:27 标题: [已解决]批处理如何将文件按照特定规则放入不同的文件夹分组?
本帖最后由 bataiping 于 2020-12-26 11:45 编辑
情况是这样的:
举例我有一个“2014”文件夹,里面有n个pdf文件,每个大小不等
我想自动把这个pdf文件自动复制到“2014-1”“2014-2”...(自动生成)等文件夹中,每个文件夹中的文件总大小不大于500MB。
当然,这个排序要按照次序来,举例:
0001.pdf 10m
0002.pdf 480m
0003.pdf 50m
0004.pdf 10m
0005.pdf 300m
0006.pdf 200m
0007.pdf 100m
0008.pdf 400m
...
这种情况下,0001和0002放入“2014-1”,0003-0005放入“2014-2”,0006和0007放入“2014-3”,最后一个放入“2014-4”这样,所有的文件夹大小都不大于500m,且顺序不乱。
大佬请问这个怎么实现?
作者: bataiping 时间: 2020-12-1 17:29
比如0003、0004、0005虽然加在一起只有360M,但是顺序不能乱,所以不能跳过0006把0007加进来。
作者: WHY 时间: 2020-12-2 10:31
- @echo off
- setlocal enabledelayedexpansion
- set /a maxSize = 500 * 1024 * 1024, n = 1, size = 0
- for /f "delims=" %%i in ('dir /b *.txt') do (
- set /a size += %%~zi
- if !size! GTR !maxSize! (
- set /a n += 1, size = %%~zi
- )
- md 2014-!n! 2>nul
- move "%%i" 2014-!n!\
- )
- pause
复制代码
作者: akb4888 时间: 2020-12-2 11:30
回复 3# WHY
w老师,可以麻烦您看一下私信吗?想请教您一些问题
作者: bataiping 时间: 2020-12-2 12:18
回复 3# WHY
谢谢老师,我在此基础上稍微修改了一点,但是还是有两个需求不知道怎么改
::问题1:自身就超过限制大小的PDF文件会自己占一个文件夹,能否加个提示写入日志
::问题2:编号能否等宽统一3位- @echo off
- for /f "delims=" %%i in ("%cd%") do set wjj=%%~ni
- setlocal enabledelayedexpansion
- set /p val=请输入大小限制(单位MB):
- set /a maxSize = %val% * 1024 * 1024, n = 1, size = 0
- for /f "delims=" %%i in ('dir /b *.pdf') do (
- set /a size += %%~zi
- if !size! GTR !maxSize! (
- set /a n += 1, size = %%~zi
- )
- md %wjj%-!n! 2>nul
- move "%%i" %wjj%-!n!\
- )
- pause
复制代码
谢谢
作者: WHY 时间: 2020-12-2 20:45
本帖最后由 WHY 于 2020-12-16 17:21 编辑
回复 5# bataiping
cmd 数值计算本身就是弱项,如果单个文件超过 2GB,或者输入浮点数,会很麻烦。可以考虑其它办法。
Test.PS1- $input = Read-Host('输入最大限制数(单位MB)');
- if( $input -notmatch '^(?:[1-9]\d+|\d)(?:\.\d+)?$' ){
- echo '输入错误';
- [Console]::ReadKey();
- exit;
- }
-
- [Collections.ArrayList]$arr = @();
- $maxSize = 1024 * 1024 * $input;
- $n = 1001;
- $size = 0;
- $myPath = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path); #脚本所在目录
- $preFix = $myPath.Split('\')[-1] + '-';
-
- $file = dir -Literal $myPath -Filter *.pdf | ?{ $_ -is [IO.FileInfo] };
-
- for( $i=0; $i -lt $file.Count; $i++ ){
- $size += $file[$i].Length;
- if( $size -gt $maxSize ){
- if( $i -gt 0 ){ $n++; }
- $size = $file[$i].Length;
- }
- $fd = $myPath + '\' + $preFix + ('' + $n).SubString(1); #新目录 = 前缀 + 3位数字
- if( ![IO.Directory]::Exists($fd) ){
- $null = md $fd; #创建新目录
- }
- mv -Literal $file[$i].FullName -Dest ($fd + '\') -Force; #移动文件
- if( $file[$i].Length -gt $maxSize ){
- [void]$arr.Add( $fd + ' 超过' + $input + 'MB' );
- }
- }
- if( $arr.Count -gt 0 ){ sc -Literal ($myPath + '\error.Log') -Value $arr; }
-
- echo 'Done';
- [Console]::ReadKey();
复制代码
作者: WHY 时间: 2020-12-2 21:00
回复 4# akb4888
你发一个新帖吧,有时间我帮你改。
作者: akb4888 时间: 2020-12-2 21:33
回复 7# WHY
好嘞,非常感谢!
作者: bataiping 时间: 2020-12-12 19:41
回复 6# WHY
很好用,首先谢谢老师
实际使用中还是有点偏差:
1,过大的文件还是要分文件夹的,自己占一个文件夹即可,文本中记录上“XXXX(该文件夹名称)大小超出限制
2,我之前修改的批处理中,命名方式当前文件夹名称-#,在您这个中用不来,我水平比较低,琢磨不出来该怎么改
3,我这边参考winrar的帮助,写了个压缩zip文件的命令,但是不知道为什么在这个文件中用不了- for /f "delims=" %%i in ('dir /ad /b') do call :zip %%i
- :zip
- set var=%*
- "C:\Program Files\WinRAR\winrar" a -r -afzip %var% %var%
- EndLocal
复制代码
谢谢老师,费心了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |