Board logo

标题: [文件操作] 如何将文件名包含指定字符串的文档移动到另一个文档,判断修改文件名某一位 [打印本页]

作者: wxback    时间: 2018-1-16 11:09     标题: 如何将文件名包含指定字符串的文档移动到另一个文档,判断修改文件名某一位

本帖最后由 wxback 于 2018-1-16 11:25 编辑

一个文件夹AAA内有子文件夹aaa,bbb,ccc,其中有文档GMSMM90A29.doc,GMSMM90A30.doc,GMSMM90A31.doc等文件分散在不同的文件夹里
如何将AAA这个根文件夹内 文件名包含GMSMM90A,后续数字不同的文档移动到一个新建的文件名为GMSMM90A的文件夹内

换个说法,
遍历AAA文件夹包含子文件夹下所有名为GMSMM90A??.doc的文件(?=0~9),并新建一个名为GMSMM90A的文件夹,将所有文件名包含GMSMM90A,后续数字不同的文件移动到此文件夹内。
GMSMM90A这个字符串是个变量可以手动修改。

如果要把GMSMM90A29.doc,GMSMM90A30.doc,GMSMM90A31.doc 这样文档中的A改成B。如果是B改成C。C改成D

刚在论坛找到一个代码是判断第19个字符是否为Z,如否则添加Z。

要怎么改才能适用是A改B,是B改C呢?
如果能A-B,B-C,C-D这么进一位就最好了,一个一个的反着替换没那么方便。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i in ('dir /a-d/b/s "A\*.xls"') do (
  3.     set "str=%%~nxi"
  4.     if /i "!str:~19,1!" neq "z" (
  5.        ren "%%i" "!str:~,19!Z!str:~19!"
  6.     )
  7. )
  8. pause
复制代码

作者: yhcfsr    时间: 2018-1-16 11:29

本帖最后由 yhcfsr 于 2018-1-16 17:18 编辑
  1. @echo off &setlocal enableDelayedExpansion
  2. rem 设置源目录
  3. set "ScDir=D:\test"
  4. rem 设置文件清单
  5. set "FileList=d:\move.txt"
  6. rem 设置目的目录
  7. set "DtDir=D:\temp"
  8. set CP1=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  9. set CP2=BCDEFGHIJKLMNOPQRSTUVWXYZZ
  10. for /l %%a in (0,1,25) do (
  11. set /a n=%%a
  12. call set [%%CP1:~!n!,1%%]=%%CP2:~!n!,1%%
  13. )
  14. cd /d "%ScDir%"
  15. for /f "delims=" %%a in ('type "%FileList%"') do (
  16. for /f  "delims=" %%b in ('dir /a-d /s /b^|findstr "%%a"') do (
  17. rem 复制文件
  18. set "FileDir=%%~dpb"
  19. set "FileDir=!FileDir:~0,-1!"
  20. robocopy /s "!FileDir!" "%DtDir%\%%a" "%%~nxb"
  21. rem 重命名文件
  22. set "name=%%~nb"
  23. call set "ch=%%[!name:~9,1!]%%"
  24. set "name=!name:~0,9!!ch!!name:~10!"
  25. ren "%DtDir%\%%a\%%~nxb" "!name!%%~xb"
  26. )
  27. )
  28. pause&exit
复制代码

作者: wxback    时间: 2018-1-17 16:26

回复 2# yhcfsr


    感谢耐心指导,运行了一下脚本发现一个情况,如果是子文件夹里的文件,是不会进位的。

之前发给我的那个分开运行的 移动文档的批处理 和 重命名的批处理 也是非常方便好用的。
作者: WHY    时间: 2018-1-18 02:04

PowerShell 代码
  1. $srcDir = 'E:\Test';   #源目录
  2. $keyWord = 'GMSMM90';  #关键字
  3. $arr = dir ($srcDir + '\' + $keyWord + '[a-z][0-9][0-9].doc') -Recurse | ?{$_ -is [IO.FileInfo]}
  4. $arr | ForEach {
  5.     $name = $_.Name;
  6.     $chr = $name.SubString($keyWord.Length, 1).ToUpper();
  7.     $int = [int][char]$chr;
  8.     $int = $int + 1 - [int][Math]::Floor($int/90)*26;
  9.     $name = $keyWord + [char]$int + $name.SubString($keyWord.Length + 1);
  10.     ren -LiteralPath $_.FullName -NewName $name -Force -WhatIf;
  11. }
复制代码

作者: WHY    时间: 2018-1-18 08:11

  1. @echo off & setlocal enabledelayedexpansion
  2. rem 原目录
  3. set "srcDir=E:\test"
  4. rem 关键字
  5. set "key=GMSMM90"
  6. for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A) do (
  7.     set "_!s!=%%i" & set "s=%%i"
  8. )
  9. for /f "delims=" %%i in ('dir /b /a-d /s "%srcDir%\%key%*.doc"^|findstr /i "\\%key%[a-z][0-9][0-9]\.doc$"') do (
  10.     set "name=%%~nxi"
  11.     set "s=!name:*%key%=!"
  12.     for %%j in ("!s:~0,1!") do echo;ren "%%i" "%key%!_%%~j!!s:~1!"
  13. )
  14. pause
复制代码





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