Batch file batch file可将同一类型的所有文件移动到另一个驱动器,以保持原始目录树

Batch file batch file可将同一类型的所有文件移动到另一个驱动器,以保持原始目录树,batch-file,archiving,Batch File,Archiving,我在这里看到的最接近的东西是使用命令“mv”,它显然不是Windows命令。Windows“移动”命令无法执行此任务 我有一个文本文件,其中列出了需要移动的每个文件,显示了它从c:\(示例c:\di1\dir2\dir3\dir4\filetomove.png)的完整路径。 一些子目录名中有空格,并且没有标准顺序。一些子目录名可能有一级深,其他子目录名有5级深 我希望这样做,我最终得到一个与旧列表完全相同的新列表,只是驱动器号是X:\而不是C:\ 在这些相同的目录中还有许多其他文件,不应触碰它们

我在这里看到的最接近的东西是使用命令“mv”,它显然不是Windows命令。Windows“移动”命令无法执行此任务

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

我希望这样做,我最终得到一个与旧列表完全相同的新列表,只是驱动器号是X:\而不是C:\

在这些相同的目录中还有许多其他文件,不应触碰它们。只有我正在处理的列表中的文件。

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

  • “计算”目标文件夹(实际上将文件父文件夹的第一个字符(应该是驱动器号)替换为存储在
    目标\u驱动器中的字符
  • 测试新的父目录是否存在,如果不存在,它将创建它(以及所有中间目录)-这就是为什么
    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
作为一个缺陷,移动文件后,脚本可能会在源驱动器上留下空目录。

您尝试过robocopy吗?