Batch file 创建一个小批量文件来管理文件
首先,如果我的英语不好,我很抱歉,我来自西班牙 我有数千个文件,分布在一个叫做INSTANCE的文件夹中的几十个文件夹中。只有两种文件类型*.new、*.old。不是每个文件夹中都有这两个文件夹。我需要将每100个*.new文件移动到一个新文件夹中。如果存在任何*.old文件,请将所有文件移动到单独的文件夹中。我试过用手来做,但过了几个小时后,我意识到这是一项主要任务,所以我想知道是否可以用批处理文件来做,或者一次处理所有文件夹,或者在实例文件夹中的每个文件夹中都这样做 可能听起来有点困惑,我首先展示了一个现在的例子,第二个例子是它必须是什么,而不是100秒,我展示了3组 之前: 之后: 总结: 在研究如何去做之前,因为我不是一个程序员,我想知道这是否可能,对我来说,学习曲线是值得的,因为这是一次性的事情。我读到有一些命令可以帮助完成一些任务MD,如果存在,移动等。。。但如果我能在一个批处理文件中完成这一切,那就不行了 提前谢谢。@ECHO OFF SETLOCAL 设置sourcedir=U:\sourcedir\t w\instance SET/a filesperdir=3 PUSHD%sourcedir% 在sourcedir中找到的每个目录的REM 对于/f delims=%%a IN “dir/b/ad*” 做 SET dirname=%%a REM初始化子目录计数器和文件计数器 设置/a子计数=0 SET/a filecount=filesperdir REM扫描文件*.new 对于/f delims=%%c IN '目录/b/a-d.\%a\*.新建2^>nul' 做 文件和移动的REM名称 设置文件名=%%c 电话:movenew REM扫描文件*.old 对于/f delims=%%c IN '目录/b/a-d.\%a\*.旧的2^>nul' 做 rem移动到zz MD.\%%a\zz>NUL 2>NUL ECHOMOVE.\%%a\%%c.\%%a\zz\ 邻苯二胺 后藤:EOF :movenew 再给我一个文件。。。 设置/a文件计数+=1 REM填充了这个子目录? 如果%filecount%gtr%filesperdir%SET/a subcount+=1&SET/a filecount=1 设置/a子数量=1000+子数量 REM尝试创建子目录 MD.\%dirname%\%subnum:~-2%>nul 2>nul ECHOMOVE.\%dirname%\%filename%.\%dirname%\%subnum:~-2%\ 后藤:eof 您需要更改sourcedir的设置以适应您的环境 所需的移动命令仅用于测试目的。验证命令是否正确后,将ECHOMOVE更改为MOVE以实际移动文件。Append>nul以抑制报告消息,例如1文件已移动 我已经在线评论了这项工作是如何完成的。请注意,您需要使用rem not::经常被用作一种更快的键入替代方法,因为此技巧::代替rem在acode块括号内的一系列语句中不起作用 粗略概述:对于找到的reac子目录,将子目录计数设置为0,将filecount设置为max。首先处理.new文件的子目录,然后处理.old文件。对于旧文件,处理简单;只需将它们移动到子目录zz。对于新文件,运行子例程movenew :movenew向移动的文件计数添加1,如果结果大于允许的数字,则增加子目录计数并重置文件计数 然后使用subnum计算子目录名称字符串的最后2个字符-将1000添加到subcount可确保subnum始终为4位数字。 然后创建目录并移动文件Batch file 创建一个小批量文件来管理文件,batch-file,cmd,command,Batch File,Cmd,Command,首先,如果我的英语不好,我很抱歉,我来自西班牙 我有数千个文件,分布在一个叫做INSTANCE的文件夹中的几十个文件夹中。只有两种文件类型*.new、*.old。不是每个文件夹中都有这两个文件夹。我需要将每100个*.new文件移动到一个新文件夹中。如果存在任何*.old文件,请将所有文件移动到单独的文件夹中。我试过用手来做,但过了几个小时后,我意识到这是一项主要任务,所以我想知道是否可以用批处理文件来做,或者一次处理所有文件夹,或者在实例文件夹中的每个文件夹中都这样做 可能听起来有点困惑,我首
请注意,如果目录已经存在,md将创建一条错误消息。2>nul将抑制此错误消息。dir命令中的2^>nul用于不包含任何目标文件类型的目录。插入符号^告诉处理器>是正在执行的命令的一部分,而不是for本身。是的,这是可能的。现在您可以进行搜索了。祝你好运。新文件的权杖重要吗?或者,只需复制100个新文件即可。你的文件真的命名为01,02,03,04吗?@Ken White谢谢。我现在正试图理解如何在一个时间段内按100对文件进行分组loop@SachaDee顺序并不重要,因为内容不同。只是为了以更易于管理的方式拥有它们。新的以不同的方式存储。这是一个实际的文件列表:-CWyGnu.new、-MP.new、0OUhSGhG.new、1oDCoUsA.new、35RUmD-C.new、4wTTSGp-.new、7NqaO.new、9tj7rJos.new、BCLrlx4BD.new、BIJ0-DcXo.new、CGQR7.new、HSic.new、NKwRs.new、QXv8SGgJ.new、Tyt6.new、Vykm.new、ylkm.new、Yl、mygjlu-mygjgjgjj.new、jclx.new、jclx.new、jclx.new、uzerana7v.new、qixxxxxxxxxxxxxxxxxxxxx.new、C,rvGUmDyv.new,vijjjv.new,z_LgR4N_.new,zyafSGhD.new,zyhc.newWOW!我感到惊讶的是,这句话比我想象的要少,但更复杂。尽管我发现了这一点:我需要的filesperdir值是100。也就是说,如果值为3,*.new文件的子目录名称从01增加到每3个文件99个,然后从01开始。如果我理解的很好,你告诉我名字从1000开始?不管怎样,我想我没有mo
每个目录100*99个文件数超过10000个,因此将filesperdir值更改为100不会影响结果。您可以将filesperdir设置为任意值。由于目标目录名为01..99,因此如果要移动的文件数超过99*filesperdir,则下一个目录名为1000+100=1100 last 2 chars=00,之后的目录名为1000+101=1101 last 2 chars=01,依此类推。如果要生成3位目录名,请使用%subnum:~-3%代替%subnum:~-2%,或者保持原样并设置FilePerDir,以便创建的目录不超过99个。我已修复了zz目录的生成问题MD.\%%a\zz>nul2>NUL`代替了'MD.\zz>nul2>NUL`就像我说的,它可以完美地处理这些变化。对于@Aacini解决方案,我唯一能说的是,如果目录包含大量文件,至少在这台计算机中,his会更快。但是一旦我理解了代码的大部分内容,我想我离自己从头开始做这件事还有很长的路要走。谢谢你们,你们帮我节省了很多工作和生命。和@Magoo一样,哇!这在第一次尝试时就起作用了,这更像是我的想法,虽然它有一些部分我不了解,但我会尝试在将来需要它们的情况下使用,如FileMod100。感谢分享您的知识并教给其他人。set/A命令中%运算符给出的模运算是整数除法的剩余部分。例如,5模2为1,9模3为0;看见“墨西哥餐厅!记住所有的数学课会很有帮助。格雷西亚斯·波尔托多。
D:\[2016]\[01 JANUARY]\INSTANCE
│
├───aaa
│ 01.new
│ 02.new
│ 03.new
│ 04.new
│ 05.new
│ 13.old
│ 14.old
│
├───bbb
│ 01.new
│ 02.new
│ 03.new
│ 04.new
│ 05.new
│ 06.new
│ 07.new
│ 08.new
│ 13.old
│ 14.old
│ 15.old
│
├───ccc
│ 01.new
│ 02.new
│ 03.new
│ 04.new
│ 05.new
│
└───ddd
01.new
02.new
03.new
04.new
05.new
06.new
07.new
08.new
09.new
11.old
D:\[2016]\[01 JANUARY]\INSTANCE
│
├───aaa
│ ├───01
│ │ 01.new
│ │ 02.new
│ │ 03.new
│ │
│ ├───02
│ │ 04.new
│ │ 05.new
│ │
│ └───zz
│ 13.old
│ 14.old
│
├───bbb
│ ├───01
│ │ 01.new
│ │ 02.new
│ │ 03.new
│ │
│ ├───02
│ │ 04.new
│ │ 05.new
│ │ 06.new
│ │
│ ├───03
│ │ 07.new
│ │ 08.new
│ │
│ └───zz
│ 13.old
│ 14.old
│ 15.old
│
├───ccc
│ ├───01
│ │ 01.new
│ │ 02.new
│ │ 03.new
│ │
│ └───02
│ 04.new
│ 05.new
│
└───ddd
├───01
│ 01.new
│ 02.new
│ 03.new
│
├───02
│ 04.new
│ 05.new
│ 06.new
│
├───03
│ 07.new
│ 08.new
│ 09.new
│
└───zz
11.old
Look inside INSTANCE
for every folder inside
if any *.old file exists create a folder called ZZ and move there all of them
Then
create folder 01 and move 100 of the *.new files
create folder 02 and move the next 100
create folder 03 and move the next 100
...
Until all the files have been moved
@echo off
setlocal EnableDelayedExpansion
rem Look inside INSTANCE
cd /D "D:\[2016]\[01 JANUARY]\INSTANCE"
rem for every folder...
for /D %%f in (*) do (
rem ... inside
cd "%%f"
rem if any *.old file exists...
if exist *.old (
rem ... create a folder called ZZ...
md ZZ
rem ... and move there all of them
move *.old ZZ
)
rem Then, create folders with two-digits and move 100 *.new files to each one
set /A twoDigits=100, files=-1
for %%a in (*.new) do (
set /A files+=1, filesMOD100=files%%100
rem Every 100 files, when the remainder of files/100 is zero...
if !filesMOD100! equ 0 (
rem ... create a new two-digits folder
set /A twoDigits+=1
md !twoDigits:~-2!
)
move "%%a" !twoDigits:~-2!
)
rem Go back to original folder -INSTANCE-
cd ..
)