Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 创建一个小批量文件来管理文件_Batch File_Cmd_Command - Fatal编程技术网

Batch file 创建一个小批量文件来管理文件

Batch file 创建一个小批量文件来管理文件,batch-file,cmd,command,Batch File,Cmd,Command,首先,如果我的英语不好,我很抱歉,我来自西班牙 我有数千个文件,分布在一个叫做INSTANCE的文件夹中的几十个文件夹中。只有两种文件类型*.new、*.old。不是每个文件夹中都有这两个文件夹。我需要将每100个*.new文件移动到一个新文件夹中。如果存在任何*.old文件,请将所有文件移动到单独的文件夹中。我试过用手来做,但过了几个小时后,我意识到这是一项主要任务,所以我想知道是否可以用批处理文件来做,或者一次处理所有文件夹,或者在实例文件夹中的每个文件夹中都这样做 可能听起来有点困惑,我首

首先,如果我的英语不好,我很抱歉,我来自西班牙

我有数千个文件,分布在一个叫做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位数字。 然后创建目录并移动文件


请注意,如果目录已经存在,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 ..

)