Windows批处理移动到可能不存在的目录

28

在Windows批处理文件中,我试图将一个文件移动到可能不存在的目录中。由于目录不存在,当我执行移动操作时,会出现以下错误:

系统找不到指定的路径

move c:\aaa\bbb\ccc\ddd\myfile.txt c:\aaa\111\222\333\444\mytext.txt

如果路径不存在,我该如何轻松地创建所需的路径呢?比如说,在 aaa 下可能还不存在 111 目录。 我希望整个路径结构都被创建出来,然后再移动文件。
我之前以为移动文件会自动创建整个路径。

6个回答

27

尝试:

md c:\aaa\111\222\333\444 2> nul

在您的移动命令之前。

md递归地创建目录,因此如果没有父目录444,则将保持分层创建。 "2> nul"确保如果您已经拥有该目录,您的命令不会出错。


“Bali C”的答案在我对该答案的评论中给出的原因更好。” - NewSites

26

如果ROBOCOPY是一种选项,它将在文件夹不存在的情况下创建文件夹结构。

尝试这个:

ROBOCOPY c:\aaa\bbb\ccc\ddd c:\aaa\111\222\333\444 mytext.txt /MOV

谢谢,但我有一个问题:你说:“如果ROBOCOPY是一个选项”。但是是否存在ROBOCOPY不可用的情况?它不稳定或者有什么问题吗? - 123iamking
1
根据我回答这个问题的日期,我猜想我可能是因为当时Windows XP仍然被广泛使用且未包含ROBOCOPY - aphoria
1
我想知道RoboCopy是否是在同一驱动器上移动文件的有效方式。文档(help RoboCopy)中提到,/mov/move通过“复制后从源删除”来工作。在同一驱动器上进行移动不应该需要复制和删除,而只需更改操作系统中文件位置显示的数据即可。因此,如果所有移动都在同一驱动器上,则最好使用命令move。请更有经验的人说一下这是否正确。 - NewSites
@NewSites 原始问题并没有要求最有效的移动命令,而只是要求一种创建文件夹结构以便将文件移动到可能不存在的目标位置的方法。我不知道 robocopy MOVE 或 MOV 开关的内部工作原理,但老实说,对于这个问题来说并不重要。负评有点过了。 - aphoria
抱歉Aphoria,但当有人询问如何做某事时,我认为他们不仅想知道任何一种方法,而是想知道最好的方法,或者提供一些可能的方法并比较它们的优缺点。使用RoboCopy似乎没有比Bali C的方法更有优势,但浪费不必要的复制过程似乎存在显著的劣势。 - NewSites

9
if not exist c:\aaa\111\222\333\444 md c:\aaa\111\222\333\444
Move c:\aaa\bbb\ccc\ddd\myfile.txt c:\aaa\111\222\333\444\mytext.txt

这个答案比被选中的更好,因为它能够透明地完成所需的操作。它避免了错误而不是忽略它。 - NewSites
1
如果必要的话,可以使用 && 将这两个命令放在一条命令行上进行组合:if not exist "NewPath" MkDir "NewPath" && move "[path\]file.ext" "NewPath[\NewFileName.ext]" - NewSites
此外,相同的技巧也可以用 copy 来代替笨拙的解决方法 echo f | xCopy ...。请参阅 https://superuser.com/questions/119263/how-to-copy-a-file-to-a-directory-in-dos-and-create-directories-if-necessary#1477168。 - NewSites

4

继续阅读Arun的回答:

md c:\aaa\111\222\333\444\mytext.txt
rd c:\aaa\111\222\333\444\mytext.txt
move c:\aaa\bbb\ccc\ddd\myfile.txt c:\aaa\111\222\333\444\mytext.txt

这将创建一个名为mytext.txt的文件夹及其父文件夹,然后删除该文件夹,但不会删除其父文件夹。
更有趣的是:
call :move_md "c:\aaa\bbb\ccc\ddd\myfile.txt" "c:\aaa\111\222\333\444\mytext.txt"
call :move_md "c:\aaa\bbb\ccc\ddd\myfile1.txt" "c:\aaa\111\222\333\444\mytext4.txt"
call :move_md "c:\aaa\bbb\ccc\ddd\myfile2.txt" "c:\aaa\111\222\333\444\mytext5.txt"
call :move_md "c:\aaa\bbb\ccc\ddd\myfile3.txt" "c:\aaa\111\222\333\444\mytext6.txt"
goto :eof

:move_md
md %2
rd %2
move %1 %2
goto :eof

2
假设您有以下目录结构。
C:\aaa\bbb\ccc\ddd
您想在aaa下创建一个名为111的目录,然后在111下创建一个名为222的目录,然后在444下创建一个名为333的目录等等。
Windows cmd允许您通过提供多级路径来创建目录结构。
因此,md c:\aaa\111\222\333\444将创建所有目录直到444。
您可能希望先创建目录,然后执行移动操作。

0

johv答案之后:我真的很喜欢这个想法,但如果您有更多的文件,由于性能限制,这将无法工作。每个文件需要大约8.5秒,而我有大约3百万个文件要移动,这使得总计算时间约为十个月。因此,我找到了这个两步解决方案-首先复制文件夹结构,然后再复制文件:

  1. xcopy C:\source C:\target /t /e
  2. move C:\source\aaa\bbb\ccc\ddd\myfile.txt C:\target\111\222\333\444\mytext.txt

显然,这样做的缺点是会创建不必要的文件夹,但对于我的目的来说,这不是问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接