Batch script - concatenate sequential numbers on f

2020-04-20 21:57发布

问题:

I'm working on a script for copying files in a folder which corresponds to the file's name and I have that part worked out using a FOR loop which checks to make sure the destination folder exists and copies the files once it has verified that it does. Example: 11-01111_ABC_DEF.pdf would go into /11/0111/. The length may vary by one or two characters but the format is consistent. I've copied my basic script below.

My problem is that sometimes a file with the same name needs to be processed. How could I go about concatenating a number to the end of the file if one or more copies of the file already exists in the destination folder?

setlocal enableextensions enabledelayedexpansion
for %%x in (*.PDF *.TXT) do (
  set "source="C:\files"
  set "dest=R:\"  
  set "filename=%%x"
  set "prefix=!filename:~0,2!"
  set "folder=!filename:~3,5!"

  if not exist !dest!\!prefix!\!folder! MOVE !filename! !source!\failed 
  if exist !source!\!filename! MOVE !filename! !dest!\!prefix!\!folder! 
)

回答1:

setlocal ENABLEDELAYEDEXPANSION
set "dest=worked"
for %%i in (*.pdf *.txt) do (
   for /f "tokens=1-3* delims=-_." %%j in ("%%i") do (
      if exist "%dest%\%%j\%%k" if exist "%dest%\%%j\%%k\%%i" if exist "%dest%\%%j\%%k\%%j-%%k-1_%%l_%%m" (
     for /f "tokens=1-9* delims=-_." %%n in ('dir %dest%\%%j\%%k\%%j-%%k*-* /b') do set /a inc=%%p
     set /a inc+=1
     move "%%i" "%dest%\%%j\%%k\%%j-%%k-!inc!_%%l_%%m" || move "%%~i" "failed"
     set inc=
     )
      if exist "%dest%\%%j\%%k\%%i" if not exist "%dest%\%%j\%%k\%%j-%%k-1_%%l_%%m" (
     move "%%i" "%dest%\%%j\%%k\%%j-%%k-1_%%l_%%m" || move "%%~i" "failed"
     )
      if exist "%dest%\%%j\%%k" if not exist "%dest%\%%j\%%k\%%~i" (
     move "%%~i" "%dest%\%%j\%%k\%%~i" || move "%%~i" "failed"
     )
      if not exist "%dest%\%%j\%%k" move "%%~i" "failed"
      )
)

put this in the folder with the .txts and .pdfs comment if you want me to change something.



回答2:

setlocal EnableDelayedExpansion
rem Set the maximum number of repeated names (keep it low):
set maxNumber=9

set "source=C:\files"
set "dest=R:\"  
for %%x in (*.PDF *.TXT) do (
  for /F "tokens=1,2 delims=-_" %%a in ("%%x") do (
    set "prefix=%%a"
    set "folder=%%b"
  )
  set "filename=%%x"

  if not exist %dest%\!prefix!\!folder! MOVE !filename! %source%\failed

  if exist %source%\!filename! (
    set "destname=!filename!"
    rem If destination filename already exists: concatenate a sequential number
    if exist %dest%\!prefix!\!folder!\!destname! (
      set "filename=%%~Nx"
      set "destname="
      for /L %%i in (1,1,%maxNumber%) do if not defined destname (
        if not exist %dest%\!prefix!\!folder!\!filename!-%%i%%~Xx set destname=!filename!-%%i%%~Xx
      )
    )
    MOVE !filename! %dest%\!prefix!\!folder!\!destname!
  )
)