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 - 从文件夹名称中删除文件的主要内容,如果未能解决你的问题,请参考以下文章
嵌套 Batch For Do 循环以使用文件夹名称和文件名