【问题标题】:Windows Batch move to directory that may not existWindows 批量移动到可能不存在的目录
【发布时间】:2011-08-31 23:45:00
【问题描述】:

在 Windows 批处理文件中,我试图将文件移动到当前可能不存在的目录。因为目录不存在,所以当我移动时,我看到如下错误:

系统找不到指定的路径

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

如果当前不存在我想要移动到的路径,如何轻松创建它?例如这里,目录 111 可能在 aaa 下尚不存在。我希望创建整个路径结构,然后移动文件。
我原以为它只是为我创造了整个路径,作为移动的一部分。

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    如果ROBOCOPY 是一个选项,如果它不存在,它将创建文件夹结构。

    试试这个:

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

    【讨论】:

    • 谢谢,但我有一个问题:您说:“如果 ROBOCOPY 是一个选项”。但是有没有ROBOCOPY 不是一个选项的情况?是不稳定还是什么?
    • 根据我回答这个问题的日期,我猜我可能是这么说的,因为 Windows XP 仍然被广泛使用并且不包括ROBOCOPY
    • 我想知道 RoboCopy 是否是移动到同一驱动器上的文件夹的有效方法。文档 (help RoboCopy) 说 /mov/move 通过“复制后从源中删除”来工作。同一驱动器上的移动不需要复制和删除,而只需更改显示文件在文件夹结构中的位置的操作系统数据。所以如果所有的移动都在同一个驱动器内,最好使用命令move。请有知识的人说一下这是否正确。
    • @NewSites 最初的问题没有要求最有效的移动命令,而只是要求创建文件夹结构以移动到可能不存在的目的地。我不知道 robocopy MOVE 或 MOV 开关的内部是如何工作的,但老实说,这个问题并不重要。反对票有点多。
    • Sorry Aphoria,但是当有人问如何做某事时,我认为他们不想要任何方法,而是最好的方法,或者通过比较选择可能的方法他们的优点和缺点。与 Bali C 的方法相比,使用 RoboCopy 似乎没有任何优势,但由于浪费了不需要的复制过程,似乎确实存在明显的劣势。
    【解决方案2】:
    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
    

    【讨论】:

    • 这是一个比所选答案更好的答案,因为它透明地完成了所需的操作。它避免了错误而不是忽略错误。
    • 如果有必要,可以使用&&将这两个命令放在一个命令行上:if not exist "NewPath" MkDir "NewPath" && move "[path\]file.ext" "NewPath[\NewFileName.ext]"
    • 此外,同样的技术可以用于copy,而不是klugey解决方法echo f | xCopy ...。见superuser.com/questions/119263/…
    【解决方案3】:

    试试:

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

    在您的移动命令之前。

    md 使目录递归,所以如果 444 没有父目录,它将继续分层创建。 "2> nul" 确保如果您已经拥有该目录,您的命令不会出错。

    【讨论】:

    • “Bali C”的答案更好,因为我在对该答案的评论中给出了原因。
    【解决方案4】:

    继续阿伦斯的回答:

    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
    

    【讨论】:

    • 你先生应该得到一块饼干!
    【解决方案5】:

    假设您有以下目录结构。

    C:\aaa\bbb\ccc\ddd

    你想在aaa下创建一个名为111的目录,然后在111下创建222,然后在444下创建333等等

    Window 的 cmd 允许您通过提供多级路径来创建目录结构

    因此 md c:\aaa\111\222\333\444 将创建直到 444 的所有目录。

    您可能需要先创建目录,然后再执行移动

    【讨论】:

      【解决方案6】:

      继续johvs answer:我真的很喜欢这个想法,但是如果您有大量文件,由于性能限制,这将无法工作。每个文件大约需要 8.5 秒,我有大约 3mio 文件要移动,这使得总计算时间大约为 10 个月。有了这个选项,我发现了这个两步解决方案 - 首先复制文件夹结构,然后再复制文件:

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

      这显然有一个缺点,它会创建不必要的文件夹,但对我来说这不是问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多