批量如何移动隐藏目录?

Batch how to move hidden directories?

我在批处理脚本 (.bat) 中使用以下脚本行将目录 (foo) 的内容复制到另一个目录 (bar):

move "C:\foo\*.*" "C:\bar\"
for /d %%a in ("C:\foo\*") do move "%%~fa" "C:\bar\"

第一行移动文件,第二行移动文件夹。但是,这些并没有移动隐藏目录。 .git 是一个常见的例子。我尝试了 for /d %%a in ("C:\foo\.*") do move "%%~fa" "C:\bar\" 但没有成功。

如何将隐藏目录与其余文件和目录一起移动?

编辑:以下解决方案非常接近于执行所需的操作,但失败了,因为 "move" 命令找不到隐藏的文件夹(在未隐藏的 .folder 上尝试了相同的操作,并且它有效):

for /f "tokens=*" %%G in ('dir /b /a:hd "C:\foo\*"') do move "C:\foo\%%G" "C:\bar\"

对于您要执行的操作,您可以在移动内容之前先使用 attrib 命令以从文件中删除隐藏属性。您可以使用它来实现您的目标:

attrib -h "C:\Program Files\Git\usr\tmp\*.*"
move "C:\Program Files\Git\usr\tmp\*.*" "C:\Program Files\Git\usr\bin\"

要对其他事物执行此操作,您可以这样做:

attrib -h "<SourceParentFolder>\*.*"
move <source> <destination>

注意事项:您应该注意@Mark 的评论。使用 C:\file\path\folder\* 是不正确的。你应该使用 C:\file\path\folder\*.*。更多信息查看

有关 attrib 的更多信息,请使用 attrib /? 或查看 this

.开头的文件或目录名称并不意味着它是隐藏的。

无论如何,for/for /D iterates over non-hidden files/directories. However, dir allows to return hidden items as well when using its /A option, which can be made use of by using for /F:

rem // Change into source directory:
pushd "C:\Program Files\Git\usr\tmp" && (
    rem // Iterate over all directories, even hidden and system ones:
    for /F "delims= eol=|" %%I in ('dir /B /A:D-S-L ".*"') do (
        rem // Actually move the directory:
        move "%%I" "C:\Program Files\Git\usr\bin\"
    )
    rem // Return from source directory:
    popd
)

经过一些额外的研究,我发现 robocopy 似乎默认包含在 Windows 10 个发行版中,并且 robocopy /MOVE 允许在一行中移动所有需要的文件和文件夹,例如:

robocopy "C:\foo" "C:\bar" /E /MOVE

可以添加其他日志记录选项以减少命令行的输出。