【问题标题】:Copy files from variable source and target locations and rename duplicates从可变源和目标位置复制文件并重命名重复项
【发布时间】:2021-03-12 01:10:42
【问题描述】:

长期读者,第一次发帖 - 感谢您提供的任何帮助。

上下文:我正在整理一组属性文件夹。当前,父文件夹是项目,属性是子文件夹。如果一个属性受到多个项目的影响,它将在项目文件夹中复制。我的目标是展平结构,因此每个属性只有一个文件夹。 (例如,从 E:\TESTING\Project\Property*.* 复制到 E:\TESTING\Property*.*)(注意:我正在寻找使用 Windows 批处理脚本,因为我没有加载权限任何自定义软件)

问题:我需要将重复文件夹中的文件合并到新位置,并确保保留所有重复文件并使用后缀重命名。有数千个文件夹,所以我需要一个循环脚本来最大程度地减少手动操作。

尝试:我在论坛中找到了一个很棒的脚本(复制如下),它可以很好地处理重复文件重命名并从 *.txt 文件设置源。我不知道如何设置变量,所以我可以拥有自定义/循环目标文件夹。 (我很高兴开发一个 *.txt 文件,如果需要,它将显示每个源文件的相关目标文件夹)

希望这是一些我还不知道的简单事情。

@echo off
setlocal

set "source=E:\TESTING\source.txt"
set "target=E:\TESTING\Destination3\"


for /f "delims=" %%A in (%source%) do (
    if not exist "%target%\%%~nxA" (
        copy "%%~A" "%target%\%%~nxA"
    ) else (
        call :index "%%~A" "%target%\%%~nxA" "1"
    )
)
exit /b

:index  source, target, count
setlocal
set /a "cnt=%~3"

if exist "%target%\%~n2(%cnt%)%~x2" (
    call :index "%~1" "%~2" "%cnt%+1"
) else copy "%~1" "%target%\%~n2(%cnt%)%~x2"
pause

【问题讨论】:

    标签: batch-file duplicates


    【解决方案1】:
    @ECHO OFF
    SETLOCAL
    SET "sourcedir=U:\sourcedir"
    SET "destdir=U:\sourcedir"
    FOR /f "delims=" %%a IN (
     'dir /b /ad "%sourcedir%\*" '
     ) DO (
     rem project in %%a
     FOR /f "delims=" %%b IN (
      'dir /b /ad "%sourcedir%\%%a\*" '
      ) DO (
      rem property in %%b
      ECHO Project\Property being processed : %%a\%%b
      rem create new? property directory
      MD "%destdir%\%%b" 2>NUL
      rem for all files in the property directory,
      FOR /f "delims=" %%p IN (
       'dir /b /a-d "%sourcedir%\%%a\%%b\*" '
       ) DO (
       IF EXIST "%destdir%\%%b\%%p" (
        rem existing filename - need to change
        SET "notcopied=Y"
        FOR /L %%r IN (1,1,99) DO IF DEFINED notcopied IF NOT EXIST "%destdir%\%%b\%%~np(%%r)%%~xp" COPY "%sourcedir%\%%a\%%b\%%p" "%destdir%\%%b\%%~np(%%r)%%~xp" >nul&SET "notcopied="
       ) ELSE (
        COPY "%sourcedir%\%%a\%%b\%%p" "%destdir%\%%b\%%p" >nul
       )
      )
     )
    )
    
    GOTO :EOF
    

    不太确定为什么要读取文件以提供源目录 - 还是目录?

    我也不确定为什么您似乎在同一个父项中创建副本 - 有什么方法可以将属性与项目区分开来吗?

    总之,上面的例程简单地将每个项目目录名依次分配给%%a,然后将每个项目子目录分配给%%b。然后将%%a\%%b 中的每个文件名读取到%%p,在目标中创建所需的子目录(2>nul 处理duplicate name 消息)并查看该文件是否已存在于目标中。

    如果没有,请照原样复制。如果是,则尝试将(1)... 添加到名称部分,直到找不到结果。 notcopied 标志用作开关,因为if defined 被解释为变量的当前值,因此将notcopied 设置为 empty 使其未定义,因此循环不会尝试进一步执行测试。

    好的 - 限制是 %%c 的最终值 - 重复文件名计数器。我将 99 设置为最大值。根据需要进行调整。您在此处使用的值越小,例程就越快(或更准确地说,速度越慢)。

    【讨论】:

    • > 这是一个优雅的解决方案。我已经测试过了,它工作得很好,正是我想要的。非常感谢:)
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2022-10-24
    • 2018-11-29
    • 2013-07-18
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多