Batch For Loop - 从文件夹名称中删除文件

Posted

技术标签:

【中文标题】Batch For Loop - 从文件夹名称中删除文件【英文标题】:Batch For Loop - removing file from folder names 【发布时间】:2014-01-27 18:11:06 【问题描述】:

我有一个文本文件,其中包含以下内容:

"C:\文件夹 A\Test.txt"

我需要将某些文件及其各自的容器从目录复制到新目录,但只复制我指定的那些文件及其父文件夹结构。

在我的批次中:

for /f "delims=" %%a in (C:\audit\test.txt) do (
  robocopy "%%~dpa" "Z:\" "%%~nxa" /E /COPY:DAT /PURGE /MIR /R:1000000 /W:30
)
pause

但是,robocopy 失败,可能与尾随反斜杠有关。源混淆并显示文件夹和 Z:。这意味着来自%%~nxa 的文件名是目标的一部分,而不是要复制的文件。有任何想法吗?

【问题讨论】:

请告诉 C:\audit\test.txt 行是否用双引号括起来? 是的,它们被 "" 引用了。 【参考方案1】:

在这种情况下,反斜杠被视为转义字符,因为它紧接在结束 " 之前。如果您将 . 附加到路径,结果将是相同的路径,但反斜杠将不再位于结束 " 之前,因此不会被视为结束引号的转义字符。

在示例中,您发布的源路径和目标路径都以\ 结尾。因此,您需要为两者添加.

for /f "delims=" %%a in (C:\audit\test.txt) do (
  robocopy "%%~dpa." "Z:\." "%%~nxa" /E /COPY:DAT /PURGE /MIR /R:1000000 /W:30
)
pause

【讨论】:

【参考方案2】:

/MIR 将递归地复制目录结构,即使是在 test.txt 中不包含文件名的目录。 请不要在第一个参数中使用双引号。 /R:1000000 /W:30 /COPY:DAT 为默认值,无需显式设置。

请尝试以下代码:

for /f "tokens=* delims=" %%a in (C:\audit\test.txt) do (
  robocopy %%~dpa "Z:\" "%%~nxa" /E /PURGE /MIR 
)
pause

如果你在文件路径中使用空格和/或特殊符号,你可以试试下面的代码使用复制命令:

@echo off
for /f "tokens=* delims=" %%a in (C:\audit\test.txt) do (
    if not exist "Z:\%%~pa" mkdir "Z:\%%~pa"
    copy /Y "%%~a" "Z:\%%~pnxa"
)

【讨论】:

这确实可以解决问题,但前提是路径不包含特殊字符或空格。 文件路径被引用(如文章 cmets 中所述),因此无需担心空格。空间字符 - 也许是的。如果用户不使用带有特殊字符的文件,也许不必担心它们。 波浪号~ 会导致引号被删除,因此如果路径中的任何位置有空格,则不带引号的%%~dpa 将被视为两个(或更多)参数。 对不起@Andriy M,你是对的。唯一的希望是用户不要使用包含空格的路径。 感谢您的帮助,但我面临的主要问题是保留权限和时间戳,因此是 robocopy。

以上是关于Batch For Loop - 从文件夹名称中删除文件的主要内容,如果未能解决你的问题,请参考以下文章

for loop 从字符串链接下载文件

嵌套 Batch For Do 循环以使用文件夹名称和文件名

通过 FOR 从 BATCH 文件按日期排序

用Plotly add_trace go.scatter for-loop在图例中只用唯一的轨迹名称填充。

oracle查询表用for in loop循环出来更新

11 tensorflow在tf.while_loop循环(非一般循环)中使用操纵变量该怎么做