我有一个包含文件和许多子目录级别的目录:
C:\Source
我想将C:\Source的内容移动到:
C:\Destination
要求:
必须在C:\SourceData中移动
批处理文件
任何其他脚本语言
尝试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/