批处理文件,用于将类型的所有文件移动到维护原始目录树的其他驱动器

时间:2016-02-02 00:03:12

标签: batch-file archiving

我在这里看到的最接近的事情是使用命令“mv”,这显然不是Windows命令。 Windows“移动”命令将无法完成此任务。

我有一个文本文件,其中列出了需要移动的每个文件,显示其来自c:\的完整路径(例如C:\ di1 \ dir2 \ dir3 \ dir4 \ filetomove.png。 某些子目录名称中包含空格,并且没有标准顺序。有些可能是一层深,其他有5层深。

我想这样做,以便最终得到一个与旧版本完全相同的新列表,除了驱动器号是X:\而不是C:\

这些目录中还有许多其他文件,不应该触及它们。只有我正在使用的列表中的那些。

1 个答案:

答案 0 :(得分:0)

实际上, Robocopy 更灵活,更不容易出错,但是这里有一些批处理“代码”来读取文本文件和每行(假设要移动的每个文件的完整路径是在一条线上):

  • “计算”目标文件夹(实际上替换文件父文件夹的第一个字符 - 应该是驱动器号 - 存储在DESTINATION_DRIVE中的那个)
  • 测试新的父目录是否存在,如果不存在则创建它(以及所有中间目录) - 这就是move命令失败的原因:因为目标父目录不存在。注意:如果存在与目标目录同名的文件,则移动操作显然会失败
  • 执行移动操作

剧本:

@echo off
set DESTINATION_DRIVE=e

for /f "tokens=*" %%f in (files.txt) do (
    call :move_file "%%f"
)
goto :eof

:move_file
    set _SRC_DIR=%~dp1
    set _DST_DIR=%DESTINATION_DRIVE%%_SRC_DIR:~1%
    if not exist "%_DST_DIR%\nul" (
        mkdir "%_DST_DIR%"
    )
    move %1 "%_DST_DIR%" 
    goto :eof

作为一个缺陷,移动文件后,脚本可能会在源驱动器上留下空目录。