Board logo

标题: [文件操作] 批处理如何将文件夹中的文件按条件比对后移动至另一文件夹 [打印本页]

作者: qin863132    时间: 2018-10-8 16:25     标题: 批处理如何将文件夹中的文件按条件比对后移动至另一文件夹

各位大神,请教个问题,我有批PDF的图纸,最后一位为图纸版本号,是以_,A,B,C......Z的顺序判断版本。文件名有12位,有13位。
现在需要将文件夹里的旧版本图纸全部移动至另一个文件夹,保留最新版本在原文件夹,这个判断该怎么写?

如图所示,需要将框选的文件移动到另一个文件夹保存。
作者: xczxczxcz    时间: 2018-10-8 17:46

本帖最后由 xczxczxcz 于 2018-10-8 17:51 编辑

以 “_” “A” “B”结尾的为旧文档?
好你看明白了点,是比较后两位字符大小的问题。
作者: xczxczxcz    时间: 2018-10-8 19:44

回复 1# qin863132

未做优化,文件夹名自己看情况改。用临时文件方法,少动脑细胞:
  1. @echo off & setlocal EnableDelayedExpansion
  2. pushd "%~dp0"
  3. MD 旧图纸备份>nul 2>nul
  4. MD tmp>nul 2>nul
  5. for /f "delims=" %%a in ('dir/a-d/b *.pdf') do (
  6. set "str=%%~na" & set "str=!str:~0,-2!"
  7. md tmp\!str!\ >nul 2>nul
  8. cd.>tmp\!str!\%%a
  9. )
  10. for /d %%a in ("tmp\*") do (
  11. call :NEW "%%a" old
  12. for /f "delims=" %%e in ('dir/a-d/b *.pdf') do (
  13. set "name=%%~ne"
  14. if /i "!name:~0,-2!"=="%%~nxa" if "%%e" neq "!old!" move /y "%%e" "旧图纸备份\"
  15. )
  16. )
  17. rd /q /s tmp>nul 2>nul
  18. pause & exit
  19. :NEW
  20. for /f "delims=" %%a in ('dir/a-d/b "%~1\*" ^|sort /r') do (set "%2=%%a" & goto :eof )
复制代码
================================
作者: /zhqsystem/zhq    时间: 2018-10-8 22:20

最后四个不规则无法区分版本号
  1. :虚拟引入
  2. del/q ".\不规则的完整路径.log"
  3. for /f "delims=" %%i in ('dir/a-d/s/b ".\*.pdf"')do (
  4. set "notmove=%%~nxi"
  5. if /i "!notmove!"=="!notmove:_=!" echo/&echo,不规则的文件和路径:%%~nxi ;%%~dpi&&(echo,%%~fi)>>".\不规则的完整路径.log"
  6. for /f "tokens=1,* delims=_" %%j in ("%%~nxi")do (
  7.   set "_=000000%%~nk"
  8.   set "_=%%j_!_:~-5!%%~xi"
  9.   set "#%%j_!_:~-5!%%~xi=%%~fi"
  10. )
  11. )
  12. set "_="&&set "notmove="
  13. :最终保留
  14. for /f "tokens=1,* delims==" %%i in ('set #')do for /f "delims=_" %%i in ("%%j")do set "保留%%i=%%j"
  15. :虚拟清空
  16. for /f "tokens=1,* delims==" %%i in ('set #')do set "%%i="
  17. :目录树结果
  18. for /f "tokens=1,* delims==" %%i in ('set 保留')do echo,%%j
  19. echo,任意键实体操作
  20. pause
  21. :实体操作
  22. for /f "delims=" %%i in ('dir/a-d/s/b ".\*.pdf"')do (
  23. set "error=y"&&for /f "tokens=1,* delims==" %%j in ('set 保留')do if /i "%%~fi"=="%%~fk" set "error="
  24. if defined error (
  25.   echo,  移动: %%~fi
  26. )else (
  27.   echo,不移动: %%~fi
  28. )
  29. )
  30. pause
  31. goto:eof
复制代码

作者: qin863132    时间: 2018-10-9 14:22

回复 2# xczxczxcz
直接比较最后一位比较准确,用后2位来进行比较的话容易误删。非常感谢您提供的代码,试了一下,可以实现要求,谢谢!
作者: tigerpower    时间: 2018-10-9 20:29

本帖最后由 tigerpower 于 2018-10-9 20:33 编辑

powershell one-liner
  1. powershell "mkdir -f bake;ls|group {$_.basename.substring(0,$_.basename.length-1)}|%{($_.group|sort -des)[1..$_.count]}|%{mv $_ bake}"
复制代码

作者: qin863132    时间: 2018-10-10 11:00

回复 6# tigerpower


谢谢您,即便我不会用这个
作者: qin863132    时间: 2018-10-10 11:01

回复 4# /zhqsystem/zhq


非常感谢您的回复,小白一个,正在仔细研究




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