从可变源和目标位置复制文件并重命名重复项

Posted

技术标签:

【中文标题】从可变源和目标位置复制文件并重命名重复项【英文标题】: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

【问题讨论】:

【参考方案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 设置为最大值。根据需要进行调整。您在此处使用的值越小,例程就越快(或更准确地说,速度越慢)。

【讨论】:

> 这是一个优雅的解决方案。我已经测试过了,它工作得很好,正是我想要的。非常感谢:)

以上是关于从可变源和目标位置复制文件并重命名重复项的主要内容,如果未能解决你的问题,请参考以下文章

Linux复制文件到某路径并重命名

WIN7重命名文件夹时 提示:文件名对目标文件夹可能过长。您可以缩短文件名并重试,或者尝试路径较短的位置

WIN7重命名文件夹时 提示:文件名对目标文件夹可能过长。您可以缩短文件名并重试,或者尝试路径较短的位置

WIN7重命名文件夹时 提示:文件名对目标文件夹可能过长。您可以缩短文件名并重试,或者尝试路径较短的位置

外壳移动文件并重命名它们

Windows批处理脚本实现批量复制文件并重命名