Windows批处理文件,用于复制和保留重复项

Dav*_*Lee 5 windows cmd copy rename batch-file

我有很多图像文件夹,我想创建一个批处理文件,可以查看所有这些目录及其子目录,并将每个图像复制到一个新文件夹(同一文件夹中的所有文件).我使用以下工作:

md "My new folder"
for /D %i in (*) do copy "%i\*" ".\My New Folder"
Run Code Online (Sandbox Code Playgroud)

但是,我还想保留带有重复文件的文件(例如,如果folder1和folder2都有名为001.jpg的图像,我想将它们复制到新文件夹中).对我来说新文件名是什么并不重要!有:

001.jpg
001(1).jpg
001(2).jpg
Run Code Online (Sandbox Code Playgroud)

会很棒,但即使只是用增量计数重命名每个文件,最后得到:

1.jpg
2.jpg
3.jpg
etc
Run Code Online (Sandbox Code Playgroud)

也没关系.我需要它只是使用标准的.bat/.cmd文件,但没有外部软件.

谢谢你的帮助!

afl*_*lat 9

这应该适合你.它会在扩展后附加一个数字,但您可以轻松地在任何地方移动它.我从.\ src目录中复制了文件,因为如果源文件与批处理文件处于同一级别,则批处理文件也会尝试评估test_folder.最好的选择是硬编码test_folder,因此它不会被DIR/S/B ...命令所评估.

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set TESTFOLDER=test_folder
md "%TESTFOLDER%"

set /a counter=0
FOR /F "tokens=*" %%i IN ('DIR /S /B /A-D .\src\*') DO FOR /F "tokens=*" %%j IN ('DIR /B "%%i"') DO IF EXIST ".\%TESTFOLDER%\%%j" (
        set /a counter=!counter!+1
        echo folder: %TESTFOLDER%
        copy "%%i" ".\%TESTFOLDER%\%%j_!counter!"
    ) ELSE copy "%%i" ".\%TESTFOLDER%\%%j"
:eof
Run Code Online (Sandbox Code Playgroud)

  • 如果任何名称包含`!`,这将失败.可以通过在循环内切换延迟扩展来修复. (2认同)

dbe*_*ham 8

以下脚本是aflat答案的改进版本.

该脚本需要两个参数:SourcePath TargetPath.

它以递归方式将SourcePath及其子文件夹中的所有文件复制到TargetPath,只有在存在重复的情况下才会向基本名称附加增加的计数器.

如果TargetPath已存在,则会出错,因为可能已存在带有_n后缀的名称.

如果您想为每个基本名称使用单独的计数器和/或您希望能够复制到现有文件夹,则需要做更多的工作.

该脚本比aflat答案更强大.例如,!工作的名字就好了.它还以更直接和更有效的方式实现aflat的算法.

::copyFlat sourcePath  TargetPath
@echo off
setlocal disableDelayedExpansion

:: Initialize and validate arguments
if "%~2" equ "" echo Error: Insufficient arguments>&2&exit /b 1
set "source=%~f1"
if not exist "%source%\" echo Error: Source folder "%source%" does not exist>&2&exit /b 1
set "target=%~f2"
if exist "%target%\" echo Error: Target folder "%target%" already exists>&2&exit /b 1

:: Do the work
md "%target%"
set /a n=0
for /r "%source%" %%F in (*) do if "%%~dpF" neq "%target%\" (
  if exist "%target%\%%~nxF" (
    set /a n+=1
    set "full=%%F"
    set "name=%%~nF"
    set "ext=%%~xF"
    setlocal enableDelayedExpansion
    copy "!full!" "!target!\!name!_!n!!ext!" >nul
    endlocal
  ) else copy "%%F" "%target%" >nul
)
Run Code Online (Sandbox Code Playgroud)