批处理如何移动隐藏目录?

Posted

技术标签:

【中文标题】批处理如何移动隐藏目录?【英文标题】:Batch how to move hidden directories? 【发布时间】:2020-09-06 03:13:47 【问题描述】:

我在批处理脚本 (.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\" 没有成功。

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

编辑:以下解决方案非常接近于执行所需的操作,但由于“移动”命令无法找到隐藏文件夹而失败(在未隐藏且有效的 .folder 上尝试了相同的操作):

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

【问题讨论】:

.*.*。 LAST . 之后的部分是扩展。以前的. 只是文件名的一部分。所以文件以. 开头,然后是包括. 在内的任何文本,直到最后一个.,然后是任何扩展名。 * 本身被假定为表示 *.* (与 MSDos 兼容的东西),但并非无处不在。使用正确的形式*.* 你可以尝试使用attrib -h *.*来移除隐藏属性 @Mark 已修复,感谢您指出这一点 【参考方案1】:

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

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

可以添加额外的日志记录选项来减少命令行的输出。

【讨论】:

应该更准确地说是%__AppDir__%Robocopy.exe "C:\foo" "C:\bar" /E /Move。目录没有尾随反斜杠,反斜杠是路径分隔符,因为您没有分隔路径,所以不需要它, (因此不需要转义它们中的每一个以使双引号没有转义). @Compo 正确,我正在相应地编辑答案 也没有必要规定*.*(因此我在之前的评论中没有这样做的原因),如果你阅读了robocopy的使用信息,@ 987654326@,你会清楚地看到default is "*.*"【参考方案2】:

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

无论如何,for/for /D 会遍历非隐藏文件/目录。但是,dir 在使用其/A 选项时也允许返回隐藏项,可以通过使用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
)

【讨论】:

这非常接近解决方案,但不起作用。我仍然得到“系统找不到指定的文件”,如果我执行以下操作,我会得到同样的结果:for /f "tokens=*" %%G in ('dir /b /a:hd "C:\foo\*"') do move "C:\foo\%%G" "C:\bar\"。这可能是因为文件夹被隐藏了。 @DCD,你用dir 使用的选项选择所有文件,(是的,一个目录在技术上仍然是一个文件),其中有隐藏和目录属性,它不排除那些具有系统重解析属性的属性。所以我建议的第一件事是将其更改为Dir /B /A:DH-S-L,以确保您不会尝试移动具有这些属性的文件。除此之外,我们不知道执行脚本的人是否有足够的权限来移动目录,或者它可能包含的一个或多个文件,所以这也可能是一个因素。 @Compo 我不熟悉系统重解析属性,但是看到我的目标是将隐藏目录移动到另一个位置,我不知道是否真的必须考虑到这一点.我通过简单地创建一个新文件夹并将隐藏标志添加到它并以管理员身份运行脚本来遇到问题,所以这绝对是一个隐藏问题而不是另一个问题。我找到并发布了一个更简单的解决方案。 @DCD,与其创建目录,添加隐藏属性,然后移动它,不如直接在需要的位置创建,并添加隐藏属性?无论如何,这些因素并不构成您问题的一部分,如果您需要针对特定​​问题而不是一般问题的帮助,您应该编辑您的问题以包含该信息,在这种情况下,应该包含其余的信息脚本内容。现在,您已经收到了答案,您应该询问回复者是否愿意您更改问题。否则你应该提交一个新的。 @Compo,排除系统文件和重新解析点是个好主意,尽管我不会添加 hidden 属性来移动非隐藏目录(尽管我可能误解了 OP 的意图)...【参考方案3】:

对于您要执行的操作,您可以先使用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\*.*。更多信息查看@Mark's comment

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

【讨论】:

不想移除隐藏属性怎么办?我希望简单地移动文件,原封不动.. 您必须编辑特定的文件属性。要添加隐藏属性,请使用attrib +h &lt;file&gt; 但是,如果我事先不知道哪些文件/文件夹应该被隐藏,哪些不应该被隐藏,那么脚本会变得更加复杂......需要涉及变量来记住哪些文件移动前隐藏/文件夹,多操作。这对于我正在寻找的东西来说太复杂了,我找到了一个更好的解决方案,并会在一分钟内发布。

以上是关于批处理如何移动隐藏目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何持久化 ExtJS 数据网格列隐藏/显示/移动/调整大小?

bat批处理,根据清单中的文件名将多个文件移动到另外一个路径下,如何批量处理?非常感谢!

如何通过 * 将包括隐藏文件在内的所有文件移动到父目录中

求助:BAT如何批量处理文件夹内含有某些字符的文件

linux 常用命令

批处理 移动文件 到当前目录 求解