Board logo

标题: [文件操作] [已解决]批处理如何将相同名称文件放在一个文件夹? [打印本页]

作者: iotalinen    时间: 2012-3-31 22:41     标题: [已解决]批处理如何将相同名称文件放在一个文件夹?

本帖最后由 iotalinen 于 2012-4-3 20:54 编辑

有一批数据,aa.tif,aa.xls,aa.txt……ab.tif,ab.xls,ab.txt…ac.tif,ac.xls,ac.txt…………
希望,将aa.tif,aa.xls,aa.txt…… 放在一个新建的 名称为 aa 的文件夹,ab.tif,ab.xls,ab.txt…   放在一个新建的 名称为 ab 的文件夹

补充
1,文件类型不一定是上面举例的,所以需要可以 设置 文件格式的 代码
2,如果需要有四种不同格式,名称相同的文件,放在一个文件夹。但必须同时存在四个文件名相同格式不同时,才放在一个与文件名一致的文件夹,如果不够四个,或多出未指定格式的文件,就不创建这个文件夹也不移动文件。
作者: apang    时间: 2012-4-1 08:04

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /a-d /b') do (
  3.   if not defined .%%~na set ".%%~na=1"
  4. )
  5. for /f "delims==" %%a in ('set.') do (
  6.   set "name=%%a"
  7.   set "name=!name:~1!"
  8.   dir /a-d "!name!.*"|findstr /c:"4 个文件">nul
  9.   if "!errorlevel!"=="0" md "!name!"&move "!name!.*" "!name!\"
  10. )
复制代码

作者: ArdentMan    时间: 2012-4-1 08:06

本帖最后由 ArdentMan 于 2012-4-1 08:49 编辑
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. Set /P Ext=输入指定的文件格式,各格式间请用空格格开:
  3. For /F "Delims=" %%i In ('Dir /a-d /b /on') Do (
  4.   If "!Str!" NEQ "%%~ni" (
  5.     If "!n!" EQU "4" If "!m!" EQU "4" (
  6.       Md "!Str!"
  7.       Move "!Str!.*" "!Str!\"
  8.     )
  9.     Set /A n=0,m=0
  10.   )
  11.   Set /a m+=1
  12.   For %%j In (%Ext%) Do If /i ".%%j" EQU "%%~xi" Set "Flag=a"
  13.   If Defined Flag Set /A n+=1&Set "Flag="
  14.   Set "Str=%%~ni"
  15. )
  16. Echo ok
  17. Pause>Nul
复制代码

作者: iotalinen    时间: 2012-4-1 20:09

呵呵   很菜啊   连在哪里更改设置 需要的 格式亦不知道啊
能在多点注释吗
作者: find    时间: 2012-4-1 21:34

回复 4# iotalinen


不如多看点基础教程吧
作者: iotalinen    时间: 2012-4-1 21:51

我再说明一下

上图是我 执行  ArdentMan  上尉的代码后的效果


而 apang 中尉的代码执行后没有反应


听取  find 大校的建议 学习中
作者: apang    时间: 2012-4-1 22:32

回复 6# iotalinen

用代码下面的复制代码,保存在要批量移动的文件位置。假如要移动的所有文件在d:\123目录下,就将代码保存在d:\123目录下,命名为aa.bat,双击aa.bat运行。再看看有木有反应。
作者: CrLf    时间: 2012-4-2 01:02

不含特殊文件名时(不能含有运算符或 !、=)可以这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (*.*) do (
  3.    set /a "\%%~na+=1"
  4. )
  5. for /f "delims=" %%a in ('set \^|findstr "=4"') do (
  6.    set name=%%a
  7.    md "!name:1~,-2!"
  8.    move "!name:1~,-2!.*" "!name:1~,-2!\"
  9. )
复制代码

作者: CrLf    时间: 2012-4-2 01:15

本帖最后由 CrLf 于 2012-4-2 01:17 编辑

若要兼容性好一些,也可这样:
  1. @echo off
  2. for %%a in (*) do if %%~xa neq .$ (
  3.    set "na=%%~na"
  4.    set "fa=%%~fa"
  5.    setlocal enabledelayedexpansion
  6.    for %%b in ("!na!*") do (
  7.       set /a n+=1
  8.    )
  9.    if !n!==4 (
  10.        md "!na!"
  11.        move "!na!.*" "!na!\"
  12.        endlocal
  13.    ) else (
  14.        for %%b in ("!na!*") do (
  15.            endlocal
  16.            ren "%%b" "%%b.$"
  17.        )
  18.    )
  19. )
  20. ren * *.
复制代码

作者: iotalinen    时间: 2012-4-2 21:25

感谢 CrLf 版主的关注,我试了一下,第二个代码是可以达到效果的。

我做了一下实验,发现代码执行时,必须同名称的4个格式的文件。如果有同名称的5个格式的文件就不会执行。当然,我可以提前预处理将不需要的格式删除。但是奢侈点想法就是,设置我所需要的文件格式。
呵呵,感谢高手们继续激发我对批处理的热情,用起来真的很爽啊。
作者: iotalinen    时间: 2012-4-2 21:30

补充一下,下面是我百度的一段代码,测试OK。
我就希望有一个类似这样的,我可以  set 1   ,2,3,4 下去就可以了。
哈哈
  1. set a=txt
  2. set b=JPG
  3. for /f "delims=" %%a in ('dir /b/a-d *.%a%') do if exist ".\%%~na.%b%" md ".\%%~na\" 2>nul&move "%%a" ".\%%~na\" 2>nul&move ".\%%~na.%b%" ".\%%~na\" 2>nul
  4. pause
复制代码

作者: iotalinen    时间: 2012-4-3 21:19

ArdentMan  上尉的代码的这句好像有问题


Set /P Ext=输入指定的文件格式,各格式间请用空格格开:

我改为     Set /P Ext=    或者   Set /P Ext=“input”
就是说,要有引号, 而且不能有汉字




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2