Using command prompt batch files to move and automatically rename duplicate files

前端 未结 2 832
一个人的身影
一个人的身影 2020-12-20 09:01

So, here\'s what I have: I created a small batch file to record the results of a ping test to a text file. What I want to do is run the batch file and move the results log

相关标签:
2条回答
  • 2020-12-20 09:12

    I have a pair of utility files that do this, so I can call from either command line, or another batch file. This manages several versions of the file in the same folder, and I would call it before moving your new file in.

    Usage is:

    archivefile 5 "c:\temp\songs" .txt [move]
    

    Where 5 is the number of versions to keep. The base file name in this example is "c:\temp\songs.txt" and it creates (in c:\temp) 5 files: songs_1.txt songs_2.txt songs_3.txt songs_4.txt songs_5.txt

    If you specify move it will move the original songs.txt otherwise it copies it.

    Note, if you're using it from another batch file (which you'll probably want to), you need to use call or it won't return to your original batch file (both batch files will exit instead, which isn't what you want):

    call archivefile 5 "c:\temp\songs" .txt
    

    You need the pair of batch files to be either in the current directory, or on the windows path. Now I think about it, archivefile_b.bat could probably be a sub-routine within the main file instead, but it ain't broke, so I'm not going to fix it.

    This is archivefile.bat:

    @Echo off 
    rem archivefile.bat - keep a number of archives of a file
    rem paramters:  n rootfile extension [move|copy]
    rem n = number of files to keep.
    rem move|copy optional indicator to rename (move) the original file instead of copying it
    rem archivefile 5 "c:\temp\songs" .txt [move]
    rem 
    
    
    
    
    if "%3"=="" goto usage
    
    set _af_n=%1
    set _af_root=%2
    set _af_ext=%3
    
    set _af_move=copy
    set _af_moveX=%4
    if "%_af_moveX%"=="move" set _af_move=move
    
    set _af_i=
    set _af_j=
    
    rem make sure that the first parameter (n) is numeric
    set /A _af_n=%_af_n%
    if "%_af_n%"=="0" echo Error: number of copies must be numeric (%1) & goto usage
    
    if not exist %_af_root%%_af_ext% echo Error: cannot locate main file: %_af_root%%_af_ext% & goto error
    
    
    rem remove the oldest file
    if exist %_af_root%_%_af_n%%_af_ext% del %_af_root%_%_af_n%%_af_ext%
    
    rem move up the remainder
    for /L %%i in (%_af_n%, -1, 1) do call archivefile_b %%i %_af_root% %_af_ext% 
    
    rem copy the original
    
    if "%_af_move%"=="move" goto moveIt
    rem move not specified - make a copy
    copy %_af_root%%_af_ext% %_af_root%_1%_af_ext%
    
    goto moveCopyDone
    
    :moveIt
    
    rem need filename only for a rename
    set _af_destfile=%_af_root%_1%_af_ext%
    set _af_destfile=%_af_destfile:"=%
    for %%i in (%_af_destfile%) do set _af_destfile=%%~ni%%~xi
    
    ren %_af_root%%_af_ext% %_af_destfile%
    
    
    
    :moveCopyDone
    
    
    
    dir %_af_root%*%_af_ext%
    
    
    goto done
    
    :usage
    echo usage: archivefile n rootfile extension
    echo   - n = number of archives to keep
    echo   - rootfile = the root filename
    echo   - extension = file extension
    echo.
    echo example:
    echo archivefile 5 "c:\Documents and Settings\gregh\My Documents\Rescued document" .txt 
    goto done
    
    :error
    rem could maybe do something here? naa.
    goto done
    
    :done
    

    This is archivefile_b.bat, which manages just one of the files:

    rem @Echo off 
    rem archivefile_b.bat - helper for the archivefile routine
    rem  -- juggles ONE of the archive files.
    
    rem paramters:  n rootfile extension
    rem n = the index to move from n to n+1
    rem archivefile 5 "c:\temp\songs" .txt
    rem therefore renames c:\temp\songs_5.txt to c:\temp\songs_6.txt
    
    
    set _afb_n=%1
    set _afb_root=%2
    set _afb_ext=%3
    
    
    rem make sure that the first parameter (n) is numeric
    set /A _afb_n=%_afb_n%
    if "%_afb_n%"=="0" echo Error: (archivefile_b) number of copies must be numeric (%1) & goto done
    
    set /A _afb_j=%_afb_n%+1
    
    rem define the file names
    set _afb_fn=%_afb_root%_%_afb_n%%_afb_ext%
    set _afb_fj=%_afb_root%_%_afb_j%%_afb_ext%
    
    rem remove the quotes
    set _afb_fn=%_afb_fn:"=%
    set _afb_fj=%_afb_fj:"=%
    
    rem can only supply a filename to the ren command (not path)
    for %%i in (%_afb_fj%) do set _afb_fj=%%~ni%%~xi
    
    rem do the rename now
    if exist "%_afb_fn%" ren "%_afb_fn%" "%_afb_fj%" 
    
    
    :done
    
    0 讨论(0)
  • 2020-12-20 09:20

    To rename files to file1 [file2][...] and move it in a desktop folder:

    @ECHO Off &SETLOCAL
    FOR %%a IN (*.txt) DO CALL:processFile "%%~a"
    goto:eof
    
    :processFile
    SETLOCAL
    :loop
    SET /a fileCounter+=1
    SET "fileName=%~n1%filecounter%%~x1"
    IF EXIST "C:\Users\%username%\Desktop\%fileName%" GOTO:loop
    ECHO MOVE "%~1" "C:\Users\%username%\Desktop\%fileName%"
    ENDLOCAL
    goto:eof
    

    Look at the output and remove the word echo before move if it looks good.

    0 讨论(0)
提交回复
热议问题