我有一个包含文件和许多子目录级别的目录:

C:\Source

我想将C:\Source的内容移动到:
C:\Destination

要求:
  • 所有文件和所有子目录
    必须在C:\SourceData中移动
  • 我将在
    批处理文件
  • 我不能使用Powershell或
    任何其他脚本语言

  • 尝试0
    XCOPY /E "C:\Source" "C:\Destination"
    

    这可以完美地工作,但是它是复制而不是移动。我要复制然后删除源文件,因为我要移动大量文件,并且没有足够的磁盘空间来一次拥有两个副本。

    尝试1次
    MOVE "C:\Source" "C:\Destination"
    

    这会将整个C:\Source目录移动到C:\Destination,所以我最终得到:
    C:\Destination\Source
    

    尝试2

    this question and accepted answer的帮助下,我想到了:
    for /r "C:\Source" %%x in (*) do move "%%x" "C:\Destination"
    

    这会在C:\Source中移动文件,但不会移动子目录或其内容。请注意,我在批处理文件中使用%% x而不是%x。

    使用FOR看起来很有希望,但是我不确定我使用的语法正确吗?我错过了什么吗?

    尝试3

    正如Nick D的建议,我尝试重命名:

    重命名“C:\Source”目标

    对于示例场景,我给出的效果很好。不幸的是,我真正的Destination目录与Source目录位于不同的级别,并且似乎不受支持:
    C:\>REN /?
    Renames a file or files.
    
    RENAME [drive:][path]filename1 filename2.
    REN [drive:][path]filename1 filename2.
    
    Note that you cannot specify a new drive or path for your destination file.
    

    我收到“命令的语法不正确。”如果尝试指定更复杂的目标路径,则会发生错误,例如:
    RENAME "C:\Source" "C:\MyOtherDirectory\Destination"
    RENAME "C:\Source" "MyOtherDirectory\Destination"
    

    最佳答案

    更新:

    调整代码为检查目标位置是否已存在文件夹,在这种情况下,应将该文件夹中的文件移到上方(并继续遍历源目录结构),否则将文件夹批发。

    在脚本末尾,将源文件夹完全删除,以消除这些文件夹,这些文件夹的文件已移至目标位置上已经存在的文件夹(这意味着这些文件夹已清空,但未在源位置删除)。

    另外,我们检查文件夹是否同时为空并且在目标位置是否已经存在,在这种情况下,我们什么也不做(将源文件夹删除到脚本的最后一行)。不这样做会导致“文件名,目录名称或卷标签语法不正确。”错误。

    !请让我知道您如何处理此事!我已经对此进行了测试,它似乎运行良好。

    for /d /r "c:\source" %%i in (*) do if exist "c:\destination\%%~ni" (dir "%%i" | find "0 File(s)" > NUL & if errorlevel 1 move /y "%%i\*.*" "c:\destination\%%~ni") else (move /y "%%i" "c:\destination")
    move /y c:\source\*.* c:\destination
    rd /s /q c:\source
    

    关于windows - 如何将一个目录树的内容移到另一个目录树?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1118540/

    10-14 19:38
    查看更多